websites integrar google for example auth2 auth javascript google-analytics-api

integrar - Cómo obtener el token javascript de acceso a la cuenta de servicio de Google



integrar login google en mi web (3)

Estoy intentando configurar un panel de análisis de mi sitio para que mi liderazgo vea el uso del sitio. No quiero que tengan que tener una cuenta de Google o agregarlas individualmente para ver los resultados.

He configurado una cuenta de servicio y acceso OAuth2. Todos los tutoriales que encuentro muestran código como este:

gapi.analytics.auth.authorize({ clientid: ''Service account client ID'', serverAuth: { access_token: ''XXXXXXXXXXXXXXXXX'' }

Y toda la documentación habla de "... una vez que recibas tu token de acceso ..." ¡Pero ninguno de ellos dice realmente cómo obtener eso! Veo las huellas dactilares del certificado, huellas dactilares de clave pública. También veo cómo generar claves JSON y P12. No veo cómo generar el token de acceso.

¿Alguien puede explicar cómo hacer esto?

Encontré this . Explica que necesito el archivo de claves y que es una mala idea, pero no dice cómo hacerlo.

También encontré this . Pero no sé nada acerca de Node.js y espero que esa sea solo una ruta posible.


¡Finalmente lo puse en funcionamiento! Usando jjj''s jsjws pura implementación de JavaScript de JWT. Utilicé esta demostración como base para generar el JWT para solicitar el token. Aqui estan los pasos

En la consola de Google Developers creé una cuenta de servicio. Aquí hay instrucciones para eso

En la consola de Google API, agregué la cuenta de servicio a las credenciales. Entonces generé una nueva clave JSON. Esto me da mi clave privada en formato de texto plano.

Luego seguí estas instrucciones de google para realizar una llamada a API autorizada utilizando HTTP / REST.

Esta es la información de encabezado requerida.

var pHeader = {"alg":"RS256","typ":"JWT"} var sHeader = JSON.stringify(pHeader);

Y el conjunto de reclamaciones es algo como esto. (Esta es la sintaxis que proporciona la biblioteca KJUR JWT descrita anteriormente).

var pClaim = {}; pClaim.aud = "https://www.googleapis.com/oauth2/v3/token"; pClaim.scope = "https://www.googleapis.com/auth/analytics.readonly"; pClaim.iss = "<[email protected]"; pClaim.exp = KJUR.jws.IntDate.get("now + 1hour"); pClaim.iat = KJUR.jws.IntDate.get("now"); var sClaim = JSON.stringify(pClaim);

Lo controvertido es poner mi clave privada en el código del lado del cliente. Para este uso, no está tan mal (no lo creo). Primero, el sitio está detrás de nuestro firewall corporativo, entonces, ¿quién lo va a "piratear"? En segundo lugar, incluso si alguien lo hubiera obtenido, la única autorización de la cuenta de servicio es ver nuestros datos analíticos, que es el propósito de mi panel de control y es que cualquiera que visite la página pueda ver nuestros datos analíticos. No voy a publicar la clave privada aquí, pero básicamente así.

var key = "-----BEGIN PRIVATE KEY-----/nMIIC..../n-----END PRIVATE KEY-----/n";`enter code here`

Luego generó un JWT firmado con

var sJWS = KJUR.jws.JWS.sign(null, sHeader, sClaim, key);

Después de eso utilicé XMLHttpRequest para llamar a la API de Google. Intenté usar FormData con la solicitud, pero no funcionó. Así que la vieja escuela (er)

var XHR = new XMLHttpRequest(); var urlEncodedData = ""; var urlEncodedDataPairs = []; urlEncodedDataPairs.push(encodeURIComponent("grant_type") + ''='' + encodeURIComponent("urn:ietf:params:oauth:grant-type:jwt-bearer")); urlEncodedDataPairs.push(encodeURIComponent("assertion") + ''='' + encodeURIComponent(sJWS)); urlEncodedData = urlEncodedDataPairs.join(''&'').replace(/%20/g, ''+''); // We define what will happen if the data are successfully sent XHR.addEventListener(''load'', function(event) { var response = JSON.parse(XHR.responseText); token = response["access_token"] }); // We define what will happen in case of error XHR.addEventListener(''error'', function(event) { console.log(''Oops! Something went wrong.''); }); XHR.open(''POST'', ''https://www.googleapis.com/oauth2/v3/token''); XHR.setRequestHeader(''Content-Type'', ''application/x-www-form-urlencoded''); XHR.send(urlEncodedData)

Después de eso, tengo mi token de acceso y puedo seguir estos tutoriales sobre el uso de la API incrustada, pero autorizando así:

gapi.analytics.auth.authorize({ serverAuth: { access_token: token } });

No olvide que debe dar permiso a la cuenta de servicio para ver el contenido, como cualquier otro usuario. Y, por supuesto, sería una muy mala idea si la cuenta de servicio estuviera autorizada para hacer algo más que solo lectura.

Probablemente también haya problemas con respecto al tiempo y la caducidad del token con los que me encontraré, pero hasta ahora todo va bien.


Puede utilizar la API de Google oficial (y alfa) para Node.js para generar el token. Es útil si tiene una cuenta de servicio.

En el servidor:

npm install -S googleapis

ES6:

import google from ''googleapis'' import googleServiceAccountKey from ''/path/to/private/google-service-account-private-key.json'' // see docs on how to generate a service account const googleJWTClient = new google.auth.JWT( googleServiceAccountKey.client_email, null, googleServiceAccountKey.private_key, [''https://www.googleapis.com/auth/analytics.readonly''], // You may need to specify scopes other than analytics null, ) googleJWTClient.authorize((error, access_token) => { if (error) { return console.error("Couldn''t get access token", e) } // ... access_token ready to use to fetch data and return to client // even serve access_token back to client for use in `gapi.analytics.auth.authorize` })


Tienes (abajo) sin comillas simples

gapi.analytics.auth.authorize({ serverAuth: { access_token: token } });

pero para que funcione, según su documentación, debe colocar comillas simples alrededor de serverAuth y access_token .

gapi.analytics.auth.authorize({ ''serverAuth'': { ''access_token'': token } });