Saltar al contenido

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

Este enunciado ha sido aprobado por nuestros especialistas así se garantiza la exactitud de esta crónica.

Solución:

¡Finalmente lo hice funcionar! Usando la implementación de JavaScript puro jsjws de kjur de JWT. Usé esta demostración como base para generar el JWT para solicitar el token. Aquí están los pasos

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

En la consola de la API de Google agregué la cuenta de servicio a las credenciales. Luego generé un nuevo JSON key. Esto me da mi privado key en formato de texto sin formato.

Luego seguí estas instrucciones de Google para realizar una llamada API autorizada usando 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 reclamos es algo como esto. (Esto utiliza la sintaxis proporcionada por 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);

La parte polémica es poner mi privado key en el código del lado del cliente. Para este uso no es tan malo (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 obtuvo, la única autorización de la cuenta de servicio es ver nuestros datos analíticos, cuyo objetivo es que cualquier persona que visite la página pueda ver nuestros datos analíticos. No voy a publicar el privado key 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, usé XMLHttpRequest para llamar a la API de Google. Intenté usar FormData con la solicitud pero no funcionó. Entonces la vieja (er) escuela

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 de inserción, pero autorizando así:

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

No olvide que debe otorgar 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 expiración del token con los que me encontraré, pero hasta ahora todo va bien.

Puede usar 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`
)

Si crees que ha resultado provechoso nuestro artículo, sería de mucha ayuda si lo compartieras con más seniors y nos ayudes a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *