Come posso verificare un token di accesso all'API di autenticazione di Google?


134

Come posso verificare un token di accesso all'autenticazione di Google?

Devo in qualche modo interrogare Google e chiedere: [il token di accesso fornito] è valido per l'account Google [esempio@esempio.com]?

Versione breve :
è chiaro come un token di accesso fornito tramite l' autenticazione di Google Api :: Autenticazione OAuth per applicazioni Web può essere utilizzato per richiedere dati da una gamma di servizi Google. Non è chiaro come verificare se un determinato token di accesso è valido per un determinato account Google. Mi piacerebbe sapere come

Versione lunga :
sto sviluppando un'API che utilizza l'autenticazione basata su token. Un token verrà restituita al momento della fornitura di una valida username + password o previa costituzione di una terza parte gettone da uno qualsiasi dei N servizi verificabili.

Uno dei servizi di terze parti sarà Google, consentendo a un utente di autenticarsi rispetto al mio servizio utilizzando il proprio account Google. Questo verrà successivamente esteso per includere account Yahoo, provider OpenID di fiducia e così via.

Esempio schematico di accesso basato su Google:

testo alternativo http://webignition.net/images/figures/auth_figure002.png

L'entità "API" è sotto il mio pieno controllo. L'entità "interfaccia pubblica" è qualsiasi app basata su Web o desktop. Alcune interfacce pubbliche sono sotto il mio controllo, altre non lo saranno e altre ancora non potrei nemmeno conoscerle.

Pertanto, non posso fidarmi del token fornito all'API nel passaggio 3. Questo verrà fornito insieme al corrispondente indirizzo email dell'account Google.

Devo in qualche modo interrogare Google e chiedere: questo token di accesso è valido per esempio@esempio.com ?

In questo caso, esempio@esempio.com è l'identificatore univoco dell'account Google: l'indirizzo email utilizzato da qualcuno per accedere al proprio account Google. Non si può presumere che si tratti di un indirizzo Gmail: qualcuno può avere un account Google senza un account Gmail.

La documentazione di Google indica chiaramente come, con un token di accesso, i dati possano essere recuperati da numerosi servizi Google. Nulla sembra affermare come è possibile verificare se un determinato token di accesso è valido in primo luogo.

Aggiorna Il token è valido per N servizi Google. Non riesco a provare un token su un servizio Google come mezzo per verificarlo in quanto non saprò quale sottoinsieme di tutti i servizi Google che un determinato utente effettivamente utilizza.

Inoltre, non userò mai il token di accesso all'autenticazione di Google per accedere a qualsiasi servizio di Google, semplicemente come mezzo per verificare che un presunto utente di Google sia effettivamente chi dice di essere. Se c'è un altro modo di farlo, sono felice di provare.


Di quale specifico servizio di autenticazione tratta questa domanda (OAuth, AuthSub, App installate, ...)? Fornisci un link più dettagliato.
Martin v. Löwis,

@Martin v. Löwis: il servizio "Autenticazione OAuth per applicazioni Web": ho aggiornato l'inizio della domanda per riflettere questo. Grazie per averlo segnalato!
Jon Cram,

un interessante articolo sulla verifica della chiave di Google potrebbe fornire ulteriori approfondimenti groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7
dotjoe

Risposte:


138

Per il controllo utente, basta pubblicare ottenere il token di accesso come accessToken e pubblicarlo e ottenere la risposta

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

puoi provare anche nella barra degli indirizzi nei browser, usare httppost e response anche in java

la risposta sarà come

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

L'ambito è l'autorizzazione data di accessToken. è possibile verificare gli ID ambito in questo collegamento

Aggiornamento: nuovo post API come di seguito

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

La risposta sarà come

 {
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

Per maggiori informazioni, https://developers.google.com/identity/sign-in/android/backend-auth


11
C'è una versione più recente di oauth2 - v3 di google. Vedi l'esempio qui: developers.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka

30

puoi verificare un token di accesso all'autenticazione di Google utilizzando questo endpoint:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

Questo è l'endpoint di convalida di Google V3 OAuth AccessToken, puoi fare riferimento dal seguente documento di Google: (Nella OAUTH 2.0 ENDPOINTSscheda)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token


Per la documentazione di Backend - la fonte della documentazione è qui
eton_ceb

26

Ok, la maggior parte delle risposte sono valide ma non del tutto giuste. L'idea di JWT è che è possibile convalidare il token senza la necessità di contattare l'emittente ogni volta. È necessario controllare l'id e verificare la firma del token con la chiave pubblica nota del certificato utilizzato da Google per firmare il token.

Vedi il prossimo post perché e come farlo.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/


3
Più voti per favore! The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
Moritz Schmitz contro Hülst,

sì! ppl stanno facendo google se chiamano semplicemente google per informazioni sul token
datdinhquoc

Non puoi farlo con i token di accesso di Google perché non sono JWT. Controllare stackoverflow.com/questions/48623656/...
DanielJaramillo

18
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}

2
Questa risposta è quasi ancora valida. Issued_to sembra non essere più impostato comunque. developers.google.com/accounts/docs/…
frostymarvelous il

6

La risposta del flusso di codice di Google oauth, oltre ai access_tokenritorni, id_tokencontiene utili informazioni di convalida in forma crittografata.

Una cosa che rende utili i token ID è il fatto che puoi passarli intorno a diversi componenti della tua app. Questi componenti possono utilizzare un token ID come meccanismo di autenticazione leggero che autentica l'app e l'utente. Ma prima di poter utilizzare le informazioni nel token ID o fare affidamento su di esse come affermazione che l'utente ha autenticato, è necessario convalidarle.

La convalida di un token ID richiede diversi passaggi:

  • Verificare che il token ID sia un JWT che sia correttamente firmato con una chiave pubblica di Google appropriata.
  • Verifica che il valore di aud nel token ID sia uguale all'ID client dell'app.
  • Verifica che il valore di iss nel token ID sia uguale a accounts.google.com o https://accounts.google.com .
  • Verificare che il tempo di scadenza (exp) del token ID non sia trascorso.
  • Se nella richiesta hai passato un parametro hd, verifica che il token ID abbia un reclamo hd corrispondente al dominio ospitato su Google Apps.

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken link ha esempi di codice per la convalida dei token ID.

Vedi anche /security/37818/why-use-openid-connect-instead-of-plain-oauth .


1

Devo in qualche modo interrogare Google e chiedere: questo token di accesso è valido per esempio@esempio.com?

No. Tutto ciò di cui hai bisogno è richiedere l'accesso standard con Accesso federato per gli utenti dell'account Google dal tuo dominio API. E solo dopo potresti confrontare "ID utente persistente" con uno che hai da "interfaccia pubblica".

Il valore di realm viene utilizzato nella pagina di accesso federata di Google per identificare il sito richiedente all'utente. Viene anche utilizzato per determinare il valore dell'ID utente persistente restituito da Google.

Quindi è necessario appartenere allo stesso dominio di "interfaccia pubblica".

E non dimenticare che l'utente deve essere sicuro che la tua API possa essere attendibile;) Quindi Google chiederà all'utente se ti consente di verificare la sua identità.


1

Ecco un esempio usando Guzzle :

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}

0

Prova a fare una richiesta autenticata da OAuth utilizzando il tuo token per https://www.google.com/accounts/AuthSubTokenInfo . Questo è documentato per funzionare solo per AuthSub, ma funziona anche per OAuth. Non ti dirà a quale utente è destinato il token, ma ti dirà per quali servizi è valido e la richiesta fallirà se il token non è valido o è stato revocato.


0

Un token di accesso OAuth arbitrario non può essere utilizzato per l'autenticazione, poiché il significato del token è al di fuori delle specifiche OAuth Core. Potrebbe essere destinato a un singolo utilizzo o a una finestra di scadenza ristretta oppure potrebbe fornire l'accesso che l'utente non desidera concedere. È anche opaco e il consumatore OAuth che l'ha ottenuto potrebbe non aver mai visto alcun tipo di identificativo utente.

Un fornitore di servizi OAuth e uno o più consumatori potrebbero facilmente usare OAuth per fornire un token di autenticazione verificabile, e ci sono proposte e idee per farlo là fuori, ma un fornitore di servizi arbitrario che parla solo OAuth Core non può fornire questo senza altri ordinazione con un consumatore. Il metodo REST AuthSubTokenInfo specifico di Google, insieme all'identificatore dell'utente, è vicino, ma non è adatto, poiché potrebbe invalidare il token o il token potrebbe essere scaduto.

Se il tuo ID Google è un identificatore OpenId e la tua "interfaccia pubblica" è un'app Web o può richiamare il browser dell'utente, probabilmente dovresti utilizzare l'OP OpenID di Google.

OpenID consiste semplicemente nel mandare l'utente all'OP e ottenere indietro un'asserzione firmata. L'interazione è esclusivamente a beneficio del RP. Non esistono token di lunga durata o altri handle specifici dell'utente che potrebbero essere utilizzati per indicare che un RP ha autenticato correttamente un utente con un OP.

Un modo per verificare una precedente autenticazione con un identificatore OpenID è semplicemente eseguire nuovamente l'autenticazione, supponendo che venga utilizzato lo stesso user-agent. L'OP dovrebbe essere in grado di restituire un'asserzione positiva senza l'interazione dell'utente (verificando ad esempio un cookie o un certificato client). L'OP è libero di richiedere un'altra interazione dell'utente, e probabilmente lo farà se la richiesta di autenticazione proviene da un altro dominio (il mio OP mi dà la possibilità di riautenticare questo particolare RP senza interagire in futuro). E nel caso di Google, l'interfaccia utente che l'utente ha attraversato per ottenere il token OAuth potrebbe non utilizzare lo stesso identificatore di sessione, quindi l'utente dovrà eseguire nuovamente l'autenticazione. Ma in ogni caso, sarai in grado di far valere l'identità.


OpenID 2.0 è stato recentemente deprecato e disabilitato da Google a favore di OpenID Connect basato su OAuth che fornisce token ID verificabili .
Vadzim,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.