126 votes

Obtenir des informations sur l'utilisateur via l'API Google

Est-il possible d'obtenir des informations du profil de l'utilisateur via l'API Google? Si c'est possible, quelle API devrais-je utiliser?

Je suis intéressé par ces informations:

Il serait également cool d'obtenir d'autres informations du profil de l'utilisateur.

5voto

LaoR Points 16

Je utilise Google API pour .Net, mais sans doute vous pouvez trouver la même façon d'obtenir ces informations en utilisant une autre version de l'API. Comme user872858 a mentionné, la portée userinfo.profile a été obsolète (article google).

Pour obtenir des informations de profil utilisateur, j'utilise le code suivant (partie modifiée à partir de l'exemple de Google) :

IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(
                                  new GoogleAuthorizationCodeFlow.Initializer
                                      {
                                            ClientSecrets = Secrets,
                                            Scopes = new[] { PlusService.Scope.PlusLogin,"https://www.googleapis.com/auth/plus.profile.emails.read"  }
                                       });    
TokenResponse _token = flow.ExchangeCodeForTokenAsync("", code, "postmessage", 
                              CancellationToken.None).Result;

                    // Créer un état d'autorisation à partir du jeton retourné.
                    context.Session["authState"] = _token;

                    // Obtenir tokeninfo pour le jeton d'accès si vous voulez vérifier.
                    Oauth2Service service = new Oauth2Service(
                     new Google.Apis.Services.BaseClientService.Initializer());
                    Oauth2Service.TokeninfoRequest request = service.Tokeninfo();
                    request.AccessToken = _token.AccessToken;
                    Tokeninfo info = request.Execute();
                    if (info.VerifiedEmail.HasValue && info.VerifiedEmail.Value)
                    {
                        flow = new GoogleAuthorizationCodeFlow(
                                    new GoogleAuthorizationCodeFlow.Initializer
                                         {
                                             ClientSecrets = Secrets,
                                             Scopes = new[] { PlusService.Scope.PlusLogin }
                                          });

                        UserCredential credential = new UserCredential(flow, 
                                                              "me", _token);
                        _token = credential.Token;
                        _ps = new PlusService(
                              new Google.Apis.Services.BaseClientService.Initializer()
                               {
                                   ApplicationName = "Le nom de votre application",
                                   HttpClientInitializer = credential
                               });
                        Person userProfile = _ps.People.Get("me").Execute();
                    }

Ensuite, vous pouvez accéder à presque tout en utilisant userProfile.

MISE À JOUR : Pour que ce code fonctionne, vous devez utiliser les portées appropriées sur le bouton de connexion Google. Par exemple, mon bouton :

2voto

Mehmet Kaplan Points 325

Il y a 3 étapes qui doivent être exécutées.

  1. Enregistrez l'identifiant client de votre application sur Google API console
  2. Demandez à votre utilisateur final de donner son consentement en utilisant cette api https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest
  3. Utilisez l'API oauth2 de Google comme décrit à l'adresse https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get en utilisant le jeton obtenu à l'étape 2. (Bien que je n'ai pas encore trouvé comment remplir correctement le paramètre "fields").

Il est très intéressant de constater que cet usage le plus simple n'est clairement décrit nulle part. Et je crois qu'il y a un danger, vous devez prêter attention au paramètre verified_email qui arrive dans la réponse. Parce que si je ne me trompe pas, cela pourrait générer de faux e-mails pour enregistrer votre application. (C'est juste mon interprétation, il y a de fortes chances que je me trompe!)

Je trouve la mécanique OAuth de Facebook beaucoup plus clairement décrite.

2voto

Alexander Farber Points 1434

Si vous souhaitez uniquement récupérer l'identifiant, le nom et la photo de l'utilisateur Google pour un visiteur de votre application web - voici ma solution côté service PHP pure pour l'année 2020 sans utiliser de bibliothèques externes -

Si vous lisez le guide Utilisation de OAuth 2.0 pour les applications serveur Web de Google (et attention, Google aime changer les liens vers sa propre documentation), alors vous n'avez qu'à effectuer 2 étapes :

  1. Présenter au visiteur une page web demandant son consentement pour partager son nom avec votre application web
  2. Ensuite, prendre le "code" transmis par la page web ci-dessus vers votre application web et récupérer un jeton (en fait, 2) depuis Google.

Un des jetons retournés est appelé "id_token" et contient l'identifiant de l'utilisateur, le nom et la photo du visiteur.

Voici le code PHP d'un jeu web que j'ai créé. Initialement j'utilisais le SDK Javascript, mais ensuite j'ai remarqué que des données utilisateur factices pouvaient être transmises à mon jeu web en utilisant uniquement le SDK côté client (surtout l'identifiant utilisateur, qui est important pour mon jeu), donc j'ai basculé vers l'utilisation de PHP côté serveur :

 $_REQUEST[CODE],
        'client_id'     => APP_ID,
        'client_secret' => APP_SECRET,
        'redirect_uri'  => REDIRECT_URI,
        'grant_type'    => 'authorization_code',
    ];

    $postContext = stream_context_create([
        'http' => [
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($tokenRequest)
        ]
    ]);

    # Étape #2 : envoyer une requête POST à l'URL du jeton et décoder le JWT id_token retourné
    $tokenResult = json_decode(file_get_contents(TOKEN_URL, false, $postContext), true);
    error_log(print_r($tokenResult, true));
    $id_token    = $tokenResult[ID_TOKEN];
    # Attention - le code suivant ne vérifie pas la signature JWT !
    $userResult  = json_decode(base64_decode(str_replace('_', '/', str_replace('-', '+', explode('.', $id_token)[1]))), true);

    $user_id     = $userResult['sub'];
    $given_name  = $userResult['given_name'];
    $family_name = $userResult['family_name'];
    $photo       = $userResult['picture'];

    if ($user_id != NULL && $given_name != NULL) {
        # afficher votre application web ou votre jeu ici, basé sur $user_id etc.
        exit();
    }
}

$userConsent = [
    'client_id'     => APP_ID,
    'redirect_uri'  => REDIRECT_URI,
    'response_type' => 'code',
    'scope'         => 'profile',
    'state'         => $CSRF_PROTECTION,
];

# Étape #1 : rediriger l'utilisateur vers la page Google demandant le consentement de l'utilisateur
header(LOCATION . http_build_query($userConsent));

?>

Vous pourriez utiliser une bibliothèque PHP pour ajouter une sécurité supplémentaire en vérifiant la signature JWT. Pour mes besoins, cela était inutile, car je fais confiance à Google pour ne pas trahir mon petit jeu web en envoyant des données visiteur fausses.

Aussi, si vous souhaitez obtenir plus de données personnelles du visiteur, alors vous avez besoin d'une troisième étape :

const USER_INFO    = 'https://www.googleapis.com/oauth2/v3/userinfo?access_token=';
const ACCESS_TOKEN = 'access_token'; 

# Étape #3 : envoyer une requête GET à l'URL des informations utilisateur
$access_token = $tokenResult[ACCESS_TOKEN];
$userResult = json_decode(file_get_contents(USER_INFO . $access_token), true);

Ou vous pourriez obtenir plus de permissions au nom de l'utilisateur - voir la longue liste dans la documentation Portées OAuth 2.0 pour les API Google.

Enfin, les constantes APP_ID et APP_SECRET utilisées dans mon code - vous les obtenez de la console API Google:

capture d'écran

1voto

alalonde Points 578

Si vous êtes dans un environnement web côté client, la nouvelle API JavaScript auth2 contient une fonction getBasicProfile() tant attendue, qui renvoie le nom de l'utilisateur, son email et l'URL de son image.

https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile

0 votes

Mais quel est l'URL réelle de l'API? J'ai regardé la documentation, je ne trouve pas l'URL réelle de l'API. Google semble nous orienter vers leur SDK, mais tout le monde ne veut pas utiliser le SDK.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X