web-dev-qa-db-fra.com

Comment identifier un utilisateur de Google OAuth2?

J'ai utilisé la connexion Facebook pour identifier les utilisateurs. Lorsqu'un nouvel utilisateur arrive, je stocke son ID utilisateur dans ma base de données. La prochaine fois qu'ils viennent, j'ai reconnu leur identifiant Facebook et je sais de quel utilisateur il s'agit dans ma base de données.

Maintenant, j'essaie de faire de même avec OAuth2 de Google, mais comment puis-je reconnaître les utilisateurs?

Google m'envoie plusieurs codes et jetons (access_token, id_token, refresh_token), mais aucun d'eux n'est constant. Cela signifie que si je me déconnecte et me reconnecte 2 minutes plus tard, les 3 valeurs ont changé. Comment puis-je identifier l'utilisateur de manière unique?

J'utilise leur bibliothèque cliente PHP: https://code.google.com/p/google-api-php-client/

56
Nathan H

J'ai inséré cette méthode dans google-api-php-client/src/apiClient.php:

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

Je peux maintenant appeler:

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

Il renvoie un tableau comme celui-ci (plus un e-mail si cette étendue a été demandée):

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

La solution provient de ce fil: https://groups.google.com/forum/#!msg/google-api-php-client/o1BRsQ9NvUQ/xa532MxegFIJ

26
Tim Strehle

Comme d'autres l'ont mentionné, vous pouvez envoyer un GET à https://www.googleapis.com/oauth2/v3/userinfo , en utilisant le jeton porteur OAuth2 que vous venez de recevoir, et vous obtiendrez une réponse avec quelques informations sur l'utilisateur (identifiant, nom, etc.).

Il convient également de mentionner que Google implémente OpenID Connect et que ce point de terminaison d'informations utilisateur n'en est qu'une partie.

OpenID Connect est une couche d'authentification au-dessus d'OAuth2. Lors de l'échange d'une autorisation code sur le point de terminaison du jeton de Google, vous obtenez un jeton d'accès (le access_token) ainsi qu'un jeton OpenID Connect ID (le id_token paramètre).

Ces deux jetons sont [~ # ~] jwt [~ # ~] (jeton Web JSON, http: //tools.ietf. org/html/draft-ietf-oauth-json-web-token ).

Si vous les décodez, vous obtiendrez quelques assertions, y compris l'ID de l'utilisateur. Si vous liez cet ID à un utilisateur de votre base de données, vous pouvez immédiatement l'identifier sans avoir à effectuer une info utilisateur supplémentaire GET (pour gagner du temps).

Comme mentionné dans les commentaires, ces jetons sont signés avec la clé privée de Google et vous pouvez vérifier la signature à l'aide de la clé publique de Google ( https://www.googleapis.com/oauth2/v3/certs ) pour vous assurer qu'ils sont authentiques.

Vous pouvez voir ce qu'il y a dans un JWT en le collant à https://jwt.io/ (faites défiler vers le bas pour le débogueur JWT). Les affirmations ressemblent à:

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

Il existe également des bibliothèques pour divers langages de programmation pour décoder par programmation les JWT.

[~ # ~] ps [~ # ~] : pour obtenir une liste à jour des URL et des fonctionnalités prises en charge par le fournisseur OpenID Connect de Google, vous pouvez vérifier cette URL: https://accounts.google.com/.well-known/openid-configuration .

85
Christophe L

Il convient de mentionner que l'API OpenID Connect ne renvoie plus d'attribut id.

C'est maintenant l'attribut sub qui sert d'identification unique de l'utilisateur.

Voir Google Dev OpenID Connect UserInfo

13
blang

"Qui est-ce?" est essentiellement un service; vous devez en demander l'accès en tant qu'étendue , puis faire une demande au serveur de ressources du profil Google pour obtenir l'identité. Voir OAuth 2.0 pour la connexion pour les détails.

1
Ryan Culpepper

Tous les JWT peuvent être validés localement avec la clé publique (la bibliothèque cliente des API Google télécharge et met en cache automatiquement les clés publiques) en vérifiant le jeton du côté de Google via le https://www.googleapis.com/oauth2/v1/ tokeninfo endpoint est nécessaire pour vérifier si l'accès à l'application a été révoqué depuis la création du token.

1
Orange

Version Java

OAuth2Sample.Java

0
honzajde