2015-02-26 6 views
14

Sto provando a configurare un dashboard di analisi del mio sito affinché il mio personale dirigente possa visualizzare l'utilizzo del sito. Non voglio che debbano avere un account Google o aggiungerli individualmente per vedere i risultati.Come ottenere token di accesso all'account del servizio Google javascript

Ho impostato un account di servizio e l'accesso OAuth2. Tutti i tutorial trovo mostrare il codice in questo modo:

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

e tutta la documentazione parla di "... una volta che ricevete il vostro token di accesso ...." Ma nessuno di loro in realtà dire come ottenere che! Vedo le impronte digitali dei certificati, le impronte digitali delle chiavi pubbliche. Vedo anche come generare chiavi JSON e P12. Non vedo come generare il token di accesso.

Qualcuno può spiegare come si fa?

Ho trovato this. Spiega che ho bisogno del file chiave e che è una cattiva idea, ma non dice come farlo realmente.

Ho trovato anche this. Ma io non so nulla di Node.js e spero che sia solo una possibile via?

+0

Ho trovato questo libreria javascript http://kjur.github.io/jsjws/index.html#demo Qualcuno ha esperienza con esso ? – Rothrock

+0

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

risposta

17

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.

+0

Dato che non ho 10 rappresentanti, non posso pubblicare più di 2 collegamenti. Quindi, se qualcuno ha mai bisogno di sapere dove ho trovato i vari tutorial si prega di chiedere e posso condividere. – Rothrock

+0

hai qualche tutorial per il login auth2 dell'account di servizio? –

+0

Ho seguito questo https://developers.google.com/identity/protocols/OAuth2ServiceAccount ma probabilmente lo hai già visto. Cosa stai cercando in particolare? – Rothrock

0

Hai (sotto), senza virgolette singole

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

ma per farlo funzionare, come per la loro documentazione è necessario mettere le virgolette singole intorno serverAuth e access_token.

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

Non è corretto. L'argomento passato all'autorizzazione (...) è un oggetto JavaScript definito utilizzando un inizializzatore dell'oggetto JavaScript. Ciò consente di definire le proprietà senza virgolette, diversamente da JSON https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Object_initializer#Object_literal_notation_vs_JSON. – thisismyrobot

0

È possibile utilizzare il funzionario (e alfa) di Google API per Node.js per generare il token. È utile se hai un account di servizio.

Sul server:

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` 
})