Finalmente ha funzionato! Utilizzo della jsjws di jjjws pura implementazione JavaScript di JWT. Ho usato this demo come base per generare il JWT per richiedere il token. Ecco i passaggi
Nella console di Google Developers ho creato un account di servizio. Ecco le istruzioni per questo
Nella console dell'API di Google ho aggiunto l'account di servizio alle credenziali. Ho quindi generato una nuova chiave JSON. Questo mi dà la mia chiave privata in formato testo.
Ho quindi seguito queste istruzioni da Google per effettuare una chiamata API autorizzata utilizzando HTTP/REST.
Questa è l'informazione di intestazione richiesta.
var pHeader = {"alg":"RS256","typ":"JWT"}
var sHeader = JSON.stringify(pHeader);
E il set di richieste è qualcosa del genere. (Questo è usare la sintassi che viene fornito dalla libreria KJUR JWT descritto sopra.)
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);
Il bit controverso sta mettendo la mia chiave privata nel codice lato client. Per questo utilizzo non è poi così male (non credo.) In primo luogo, il sito è dietro il nostro firewall aziendale, quindi chi lo "hackerà"? In secondo luogo, anche se qualcuno l'ha ricevuta, l'unica autorizzazione dell'account di servizio è quella di visualizzare i nostri dati di analisi: lo scopo della mia dashboard è che chiunque visita la pagina può visualizzare i nostri dati di analisi. Non pubblicheremo la chiave privata qui, ma fondamentalmente mi piace.
var key = "-----BEGIN PRIVATE KEY-----\nMIIC....\n-----END PRIVATE KEY-----\n";`enter code here`
quindi generato un JWT firmato con
var sJWS = KJUR.jws.JWS.sign(null, sHeader, sClaim, key);
Dopo che ho usato XMLHttpRequest per chiamare l'API di Google. Ho provato a utilizzare FormData con la richiesta ma non ha funzionato.Così il vecchio (er) Scuola
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)
Dopo che ho il mio token di accesso e posso seguire these tutorials sul utilizzando l'API embed, ma che autorizza in questo modo:
gapi.analytics.auth.authorize({
serverAuth: {
access_token: token
}
});
Non dimenticate che si devi dare l'autorizzazione dell'account di servizio per visualizzare il contenuto, proprio come qualsiasi altro utente. E, naturalmente, sarebbe una pessima idea se l'account di servizio fosse autorizzato a fare qualcosa di diverso dalla sola lettura.
Probabilmente ci sono anche problemi relativi ai tempi e ai token in scadenza in cui mi imbatterò, ma finora tutto bene.
Ho trovato questo libreria javascript http://kjur.github.io/jsjws/index.html#demo Qualcuno ha esperienza con esso ? – Rothrock
Dove posso ottenere la mia chiave privata? Ho scaricato il file .p12, ma non è leggibile da me. Ho usato un servizio online per convertire il file .p12 in un file PEM che posso aprire nel blocco note, ma la chiave privata mostrata è troppo corta rispetto ad altre che ho visto. – Rothrock