Wie kann ich ein Google-Authentifizierungs-API-Zugriffstoken überprüfen?

134

Wie kann ich ein Google-Authentifizierungszugriffstoken überprüfen?

Ich muss Google irgendwie abfragen und fragen: Ist [Zugriffstoken gegeben] für das Google-Konto [[email protected]] gültig?

Kurzversion :
Es ist klar, wie ein über die Google Authentication Api :: OAuth-Authentifizierung für Webanwendungen bereitgestelltes Zugriffstoken verwendet werden kann, um dann Daten von einer Reihe von Google-Diensten anzufordern. Es ist nicht klar, wie überprüft werden soll, ob ein bestimmtes Zugriffstoken für ein bestimmtes Google-Konto gültig ist. Ich würde gerne wissen wie.

Lange Version :
Ich entwickle eine API, die eine tokenbasierte Authentifizierung verwendet. Ein Token wird nach Angabe eines gültigen Benutzernamens + Passworts oder nach Bereitstellung eines Tokens eines Drittanbieters von einem der N überprüfbaren Dienste zurückgegeben.

Einer der Dienste von Drittanbietern ist Google, mit dem sich ein Nutzer mit seinem Google-Konto bei meinem Dienst authentifizieren kann. Dies wird später um Yahoo-Konten, vertrauenswürdige OpenID-Anbieter usw. erweitert.

Schematisches Beispiel für einen Google-basierten Zugriff:

Alternativtext http://webignition.net/images/figures/auth_figure002.png

Die 'API'-Entität steht unter meiner vollen Kontrolle. Die Entität "öffentliche Schnittstelle" ist eine web- oder desktopbasierte App. Einige öffentliche Schnittstellen sind unter meiner Kontrolle, andere nicht und andere, von denen ich vielleicht noch nie etwas weiß.

Daher kann ich dem in Schritt 3 an die API übermittelten Token nicht vertrauen. Dieses wird zusammen mit der entsprechenden E-Mail-Adresse des Google-Kontos bereitgestellt.

Ich muss Google irgendwie abfragen und fragen: Ist dieses Zugriffstoken für [email protected] gültig ?

In diesem Fall ist [email protected] die eindeutige Kennung des Google-Kontos - die E-Mail-Adresse, mit der sich jemand bei seinem Google-Konto anmeldet. Es kann nicht davon ausgegangen werden, dass es sich um eine Google Mail-Adresse handelt. Jemand kann ein Google-Konto ohne ein Google Mail-Konto haben.

In der Google-Dokumentation wird klar angegeben, wie mit einem Zugriffstoken Daten von einer Reihe von Google-Diensten abgerufen werden können. Nichts scheint zu sagen, wie Sie überprüfen können, ob ein bestimmtes Zugriffstoken überhaupt gültig ist.

Update Das Token ist für N Google-Dienste gültig. Ich kann kein Token für einen Google-Dienst versuchen, um es zu überprüfen, da ich nicht weiß, welche Teilmenge aller Google-Dienste ein bestimmter Nutzer tatsächlich verwendet.

Darüber hinaus werde ich das Google-Authentifizierungszugriffstoken niemals für den Zugriff auf Google-Dienste verwenden, sondern lediglich, um zu überprüfen, ob ein vermeintlicher Google-Nutzer tatsächlich der ist, für den er sich ausgibt. Wenn es einen anderen Weg gibt, versuche ich es gerne.

Jon Cram
quelle
Um welchen speziellen Authentifizierungsdienst handelt es sich bei dieser Frage (OAuth, AuthSub, Installierte Apps, ...)? Bitte geben Sie einen detaillierteren Link an.
Martin v. Löwis
@Martin v. Löwis: Der Dienst "OAuth-Authentifizierung für Webanwendungen" - Ich habe den Beginn der Frage aktualisiert, um dies widerzuspiegeln. Vielen Dank für den Hinweis!
Jon Cram
Ein interessanter Artikel über die Überprüfung von Google-Schlüsseln bietet
dotjoe

Antworten:

138

Für die Benutzerprüfung senden Sie einfach das Zugriffstoken als accessToken und veröffentlichen Sie es und erhalten Sie die Antwort

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

Sie können es auch in Browsern in der Adressleiste versuchen, httppost und Antwort auch in Java verwenden

Antwort wird wie sein

{
     "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"
    }

Der Bereich ist die angegebene Berechtigung des accessToken. Sie können die Bereichs-IDs in diesem Link überprüfen

Update: Neuer API-Beitrag wie unten

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

Die Antwort lautet wie folgt

 {
 // 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": "[email protected]",
 "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"
}

Weitere Informationen finden Sie unter https://developers.google.com/identity/sign-in/android/backend-auth

Vinoj John Hosan
quelle
11
Es gibt eine neuere Version für Googles oauth2 - v3. Siehe Beispiel hier: developer.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka
30

Sie können ein Google-Authentifizierungszugriffstoken mithilfe dieses Endpunkts überprüfen:

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

Dies ist der OAuth AccessToken-Endpunkt von Google V3, auf den Sie im folgenden Google-Dokument verweisen können: (In OAUTH 2.0 ENDPOINTSTab)

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

Nick Tsai
quelle
Für Backend-Dokumentation - Dokumentationsquelle ist hier
eton_ceb
25

Ok, die meisten Antworten sind gültig, aber nicht ganz richtig. Die Idee von JWT ist, dass Sie das Token validieren können, ohne den Aussteller jedes Mal kontaktieren zu müssen. Sie müssen die ID und die Signatur des Tokens mit dem bekannten öffentlichen Schlüssel des Zertifikats überprüfen, mit dem Google das Token signiert hat.

Siehe den nächsten Beitrag warum und wie das geht.

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

Remco
quelle
2
Weitere Upvotes bitte! The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
Moritz Schmitz v. Hülst
Ja! ppl sind ddos-ing google, wenn sie nur google für token info
anrufen
Sie können dies nicht mit Google-Zugriffstoken tun, da es sich nicht um JWTs handelt. Überprüfen Sie 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;
    }
}
ahmed
quelle
2
Diese Antwort ist fast noch gültig. Issued_to scheint jedoch nicht mehr gesetzt zu sein. developer.google.com/accounts/docs/…
frostymarvelous
6

Die Antwort auf den Codefluss von Google enthält zusätzlich zu den access_tokenRückgaben id_tokenauch nützliche Informationen zur Validierung in verschlüsselter Form.

Eine Sache, die ID-Token nützlich macht, ist die Tatsache, dass Sie sie an verschiedene Komponenten Ihrer App weitergeben können. Diese Komponenten können ein ID-Token als einfachen Authentifizierungsmechanismus verwenden, der die App und den Benutzer authentifiziert. Bevor Sie jedoch die Informationen im ID-Token verwenden oder sich darauf verlassen können, dass der Benutzer sich authentifiziert hat, müssen Sie sie validieren.

Die Validierung eines ID-Tokens erfordert mehrere Schritte:

  • Stellen Sie sicher, dass es sich bei dem ID-Token um ein JWT handelt, das ordnungsgemäß mit einem geeigneten öffentlichen Google-Schlüssel signiert ist.
  • Stellen Sie sicher, dass der Wert von aud im ID-Token der Client-ID Ihrer App entspricht.
  • Stellen Sie sicher, dass der Wert von iss im ID-Token gleich accounts.google.com oder https://accounts.google.com ist .
  • Stellen Sie sicher, dass die Ablaufzeit (exp) des ID-Tokens nicht abgelaufen ist.
  • Wenn Sie in der Anforderung einen HD-Parameter übergeben haben, überprüfen Sie, ob das ID-Token einen HD-Anspruch hat, der mit Ihrer von Google Apps gehosteten Domain übereinstimmt.

Der Link https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken enthält Codebeispiele zur Validierung von ID-Token.

Siehe auch /security/37818/why-use-openid-connect-instead-of-plain-oauth .

Vadzim
quelle
1

Ich muss Google irgendwie abfragen und fragen: Ist dieses Zugriffstoken für [email protected] gültig?

Nein. Sie müssen lediglich eine Standardanmeldung mit Verbundanmeldung für Google-Kontonutzer von Ihrer API-Domain anfordern . Und erst danach können Sie die "persistente Benutzer-ID" mit einer über die "öffentliche Schnittstelle" vergleichen.

Der Wert von Realm wird auf der Google Federated Login-Seite verwendet, um die anfordernde Site für den Benutzer zu identifizieren. Es wird auch verwendet, um den Wert der von Google zurückgegebenen persistenten Benutzer-ID zu bestimmen.

Sie müssen also aus derselben Domäne stammen wie die 'öffentliche Schnittstelle'.

Und vergessen Sie nicht, dass der Nutzer sicher sein muss, dass Ihre API vertrauenswürdig ist;) Google wird den Nutzer also fragen, ob Sie damit seine Identität überprüfen können.

Malx
quelle
1

Hier ist ein Beispiel mit 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();
}
mpen
quelle
0

Versuchen Sie, eine OAuth-authentifizierte Anfrage mit Ihrem Token an https://www.google.com/accounts/AuthSubTokenInfo zu stellen . Dies funktioniert nur für AuthSub, aber auch für OAuth. Es wird Ihnen nicht mitgeteilt, für welchen Benutzer das Token bestimmt ist, aber es wird Ihnen mitgeteilt, für welche Dienste es gültig ist, und die Anforderung schlägt fehl, wenn das Token ungültig ist oder widerrufen wurde.

Jonathan
quelle
0

Ein beliebiges OAuth-Zugriffstoken kann nicht zur Authentifizierung verwendet werden, da die Bedeutung des Tokens außerhalb der OAuth Core-Spezifikation liegt. Es kann für eine einmalige Verwendung oder ein enges Ablauffenster vorgesehen sein oder einen Zugriff bieten, den der Benutzer nicht gewähren möchte. Es ist auch undurchsichtig, und der OAuth-Verbraucher, der es erhalten hat, hat möglicherweise nie eine Art von Benutzer-ID gesehen.

Ein OAuth-Dienstanbieter und ein oder mehrere Verbraucher könnten OAuth problemlos verwenden, um ein überprüfbares Authentifizierungstoken bereitzustellen, und es gibt Vorschläge und Ideen, dies zu tun, aber ein beliebiger Dienstanbieter, der nur OAuth Core spricht, kann dies nicht ohne andere Co-Anbieter bereitstellen Ordination mit einem Verbraucher. Die Google-spezifische AuthSubTokenInfo-REST-Methode ist zusammen mit der Kennung des Benutzers eng, aber auch nicht geeignet, da sie das Token ungültig machen oder abgelaufen sein könnte.

Wenn Ihre Google ID eine OpenId-ID ist und Ihre "öffentliche Oberfläche" entweder eine Web-App ist oder den Browser des Benutzers aufrufen kann, sollten Sie wahrscheinlich das OpenID OP von Google verwenden.

OpenID besteht darin, den Benutzer nur an das OP zu senden und eine signierte Zusicherung zurückzugewinnen. Die Interaktion dient ausschließlich dem RP. Es gibt kein langlebiges Token oder anderes benutzerspezifisches Handle, mit dem angegeben werden könnte, dass ein RP einen Benutzer erfolgreich bei einem OP authentifiziert hat.

Eine Möglichkeit, eine vorherige Authentifizierung anhand einer OpenID-Kennung zu überprüfen, besteht darin, die Authentifizierung erneut durchzuführen, sofern derselbe Benutzeragent verwendet wird. Das OP sollte in der Lage sein, eine positive Behauptung ohne Benutzerinteraktion zurückzugeben (z. B. durch Überprüfen eines Cookies oder eines Client-Zertifikats). Es steht dem OP frei, eine weitere Benutzerinteraktion zu erfordern, und dies ist wahrscheinlich der Fall, wenn die Authentifizierungsanforderung von einer anderen Domäne stammt (mein OP bietet mir die Möglichkeit, diesen bestimmten RP erneut zu authentifizieren, ohne in Zukunft zu interagieren). In Googles Fall verwendet die Benutzeroberfläche, die der Benutzer zum Abrufen des OAuth-Tokens durchlaufen hat, möglicherweise nicht dieselbe Sitzungskennung, sodass sich der Benutzer erneut authentifizieren muss. In jedem Fall können Sie jedoch die Identität bestätigen.

Karl Anderson
quelle
OpenID 2.0 wurde kürzlich von Google zugunsten von OAuth-basiertem OpenID Connect, das überprüfbare ID-Token bereitstellt, veraltet und deaktiviert .
Vadzim