webentwicklung-frage-antwort-db.com.de

Wie identifiziere ich einen Google OAuth2-Nutzer?

Ich habe die Facebook-Anmeldung verwendet, um Benutzer zu identifizieren. Wenn ein neuer Benutzer kommt, speichere ich seine Benutzer-ID in meiner Datenbank. Beim nächsten Mal habe ich ihre Facebook-ID erkannt und weiß, welcher Benutzer sich in meiner Datenbank befindet.

Jetzt versuche ich dasselbe mit Googles OAuth2 zu machen, aber wie kann ich die Benutzer erkennen?

Google sendet mir mehrere Codes und Token (access_token, id_token, refresh_token), von denen jedoch keiner konstant ist. Das heißt, wenn ich mich 2 Minuten später abmelde und wieder anmelde, haben sich alle 3 Werte geändert. Wie kann ich den Benutzer eindeutig identifizieren?

Ich verwende ihre PHP Client-Bibliothek: https://code.google.com/p/google-api-php-client/

56
Nathan H

Ich habe diese Methode in google-api-php-client/src/apiClient.php eingefügt:

public function getUserInfo() 
{
    $req = new apiHttpRequest('https://www.googleapis.com/oauth2/v1/userinfo');
    // XXX error handling missing, this is just a rough draft
    $req = $this->auth->sign($req);
    $resp = $this->io->makeRequest($req)->getResponseBody();
    return json_decode($resp, 1);  
}

Jetzt kann ich anrufen:

$client->setAccessToken($_SESSION[ 'token' ]);
$userinfo = $client->getUserInfo();

Es gibt ein Array wie das folgende zurück (plus E-Mail, wenn dieser Bereich angefordert wurde):

Array
(
    [id] => 1045636599999999999
    [name] => Tim Strehle
    [given_name] => Tim
    [family_name] => Strehle
    [locale] => de
)

Die Lösung stammt aus diesem Thread: https://groups.google.com/forum/#!msg/google-api-php-client/o1BRsQ9NvUQ/xa532MxegFIJ

26
Tim Strehle

Wie bereits erwähnt, können Sie ein GET an https://www.googleapis.com/oauth2/v3/userinfo senden. Verwenden Sie dazu den OAuth2-Inhaber-Token, den Sie gerade erhalten haben, und Sie erhalten eine Antwort mit Einige Informationen über den Benutzer (ID, Name usw.).

Erwähnenswert ist auch, dass Google OpenID Connect implementiert und dass dieser Endpunkt für Benutzerinformationen nur ein Teil davon ist.

OpenID Connect ist eine Authentifizierungsebene über OAuth2. Wenn Sie eine Autorisierung code am Token-Endpunkt von Google austauschen, erhalten Sie ein Zugriffstoken (das access_token -Parameter) sowie ein OpenID Connect ID-Token (das id_token Parameter).

Diese beiden Token sind [~ # ~] jwt [~ # ~] (JSON Web Token, http: //tools.ietf. org/html/draft-ietf-oauth-json-web-token ).

Wenn Sie sie dekodieren, erhalten Sie einige Zusicherungen, einschließlich der ID des Benutzers. Wenn Sie diese ID mit einem Benutzer in Ihrer Datenbank verknüpfen, können Sie diese sofort identifizieren, ohne dass Sie eine zusätzliche Benutzerinfo GET ausführen müssen (dies spart Zeit).

Wie in den Kommentaren erwähnt, sind diese Token mit dem privaten Schlüssel von Google signiert. Unter Umständen möchten Sie die Signatur mit dem öffentlichen Schlüssel von Google überprüfen ( https://www.googleapis.com/oauth2/v3/certs ). um sicherzustellen, dass sie authentisch sind.

Sie können sehen, was in einer JWT enthalten ist, indem Sie sie unter https://jwt.io/ (Scrollen Sie nach unten, um den JWT-Debugger anzuzeigen) einfügen. Die Behauptungen sehen ungefähr so ​​aus:

{
    "iss":"accounts.google.com",
    "id":"1625346125341653",
    "cid":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "aud":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "token_hash":"WQfLjdG1mDJHgJutmkjhKDCdA",
    "iat":1567923785,
    "exp":1350926995
}

Es gibt auch Bibliotheken für verschiedene Programmiersprachen, um JWTs programmgesteuert zu dekodieren.

[~ # ~] ps [~ # ~] : Um eine aktuelle Liste der vom OpenID Connect-Anbieter von Google unterstützten URLs und Funktionen zu erhalten, können Sie diese überprüfen diese URL: https://accounts.google.com/.well-known/openid-configuration .

85
Christophe L

Es sollte erwähnt werden, dass die OpenID Connect API kein id Attribut mehr zurückgibt.

Es ist jetzt das sub Attribut, das als eindeutige Benutzeridentifikation dient.

Siehe Google Dev OpenID Connect UserInfo

13
blang

"Wer ist das?" ist im Wesentlichen eine Dienstleistung; Sie müssen den Zugriff als Bereich anfordern und dann eine Anfrage an den Ressourcenserver des Google-Profils stellen um die Identität zu bekommen. Siehe OAuth 2.0 für Login für Details.

1
Ryan Culpepper

Obwohl JWTs lokal mit dem öffentlichen Schlüssel validiert werden können (die Google APIs Client Library lädt die öffentlichen Schlüssel automatisch herunter und speichert sie im Cache), überprüfen Sie das Token auf Googles Seite über https://www.googleapis.com/oauth2/v1/ tokeninfo Der Endpunkt ist erforderlich, um zu überprüfen, ob der Zugriff für die Anwendung seit der Erstellung des Tokens widerrufen wurde.

1
Orange

Java-Version

OAuth2Sample.Java

0
honzajde