web-dev-qa-db-fra.com

API Google OAuth pour obtenir l'adresse e-mail de l'utilisateur?

Je joue avec OAuth 2.0 Playground de Google avec mon compte Google personnel, mais je ne parviens pas à récupérer mon adresse Gmail en utilisant le terrain de jeu.

La portée que j'utilise est:

email profile https://www.googleapis.com/auth/plus.login

Mais quand j'appelle l'API:

https://www.googleapis.com/oauth2/v2/userinfo

Je reçois diverses informations sur l'utilisateur telles que le nom de famille, le prénom, le sexe, la photo, etc., mais cela ne renvoie pas le courrier électronique de l'utilisateur.

Comment récupérer l'adresse email de l'utilisateur? Ai-je le mauvais périmètre ou est-ce que j'appelle la mauvaise API? Je pense que cela devrait être très simple, mais j'essaie littéralement de comprendre cela depuis des heures et je ne parviens pas à trouver une combinaison d'API et de périmètre fournissant systématiquement l'adresse de messagerie de l'utilisateur.

36
RevolutionTech

Mise à jour: décembre 2018

Le 20 décembre, Google a annoncé que l'API Google+ serait refusée en mars 2019, avec une défaillance intermittente commençant à la fin du mois de janvier 2019. Dans le cadre du noeud final plus.people.get, il est obsolète et doit être arrêté.

Le noeud final userinfo est obsolète (voir la clarification) et devrait fournir les informations en supposant

  1. Vous demandez la portée https://developers.google.com/identity/sign-in/web/devconsole-project et
  2. Vous demandez le champ email.

Clarification: 24 janvier 2019

Google documenté que le point de terminaison userinfo (v2) était obsolète, mais plus tard il a été remplacé par "obsolète, mais maintenu disponible pour des raisons de compatibilité ascendante".

Documentation actuelle explique comment obtenir des informations de profil et de courrier électronique via la méthode openid actuellement prise en charge. Ceci inclut l'utilisation du point de terminaison "userinfo" spécifié dans leur discovery document , comme requis par OpenID Connect.

Pour le moment, cette URL est https://openidconnect.googleapis.com/v1/userinfo, mais cela a changé dans le passé et le document de découverte situé à https://accounts.google.com/.well-known/openid-configuration est la source faisant autorité pour l'URL à utiliser.

Donc, pour être clair:

  • L'ancienne URL userinfo est conservée pour des raisons de compatibilité ascendante.
  • La nouvelle URL userinfo est disponible sur le document de découverte.

Quoi qu'il en soit, la version plus de tout (décrite ci-dessous) est obsolète et doit être supprimée .

Réponse originale

Il y a beaucoup de problèmes ici dans ce que vous faites et comment vous essayez de le faire.

Pour les débutants, le point de terminaison https://www.googleapis.com/oauth2/v2/userinfo est obsolète et sa suppression est prévue pour septembre 2014. Son fonctionnement a commencé de manière incohérente. Ne l'utilisez donc pas.

Comme @abraham l'a noté, vous utiliserez le people.get endpoint à https://www.googleapis.com/plus/v1/people/me. Cela devrait vous donner le champ emails contenant un tableau d'adresses. Dans votre cas, il y en aura probablement un seul qui aura un type de "compte".

45
Prisoner

À partir de 2017: utilisez la portée email. Voir Autoriser les demandes d'API .

Cette étendue email est équivalente à et remplace le https://www.googleapis.com/auth/userinfo.email scope.

 enter image description here

40
turdus-merula

Vous voudrez ajouter la portée https://www.googleapis.com/auth/userinfo.email ou remplacer https://www.googleapis.com/oauth2/v2/userinfo par celle-ci. Si vous utilisez l'exemple HTML fourni, vous pouvez répertorier plusieurs étendues séparées par un espace.

<span
  class="g-signin"
  data-callback="signInCallback"
  data-clientid="{{ plus_id }}"
  data-cookiepolicy="single_Host_Origin"
  data-requestvisibleactions="http://schemas.google.com/AddActivity"
  data-scope="https://www.googleapis.com/auth/plus.login   
  https://www.googleapis.com/auth/userinfo.email">
</span>
10
Tom

Je suis venu ici en cherchant la raison pour laquelle mon serveur n'a pas reçu de courrier électronique en réponse à l'appel de/oauth2/v2/userinfo api. Ce n’est qu’une fois que j’ai vu cela et cela a bien fonctionné dans le passé. 

La réponse donnait une bonne avance. En corrigeant cela, plusieurs autres ressources ont été utiles. Néanmoins, je ne suis pas sûr que l'attente d'un courrier électronique dans la réponse soit acceptable. Ainsi, mettez les erreurs dans le code au cas où les courriels ne seraient pas renvoyés.

  1. Documentation de l'API Google sur la migration vers Google + Signin .
  2. https://www.googleapis.com/auth/userinfo.email scope
  3. Ressources humaines documentation
  4. Ajoutez google + api au projet à l’aide de - console de développeur google . Le nombre d'appels gratuits est assez élevé (20 m pour Google + APP de connexion par jour).
  5. Ajoutez le traitement des erreurs et la connexion au code serveur si api ne renvoie aucun courrier électronique. Dans mon cas, je cherchais seulement un email de type = compte. 
6
Sushil

Pour vous connecter avec Google à l'aide d'OAuth 2.0, il n'est pas nécessaire de faire une demande distincte pour obtenir le courrier électronique de l'utilisateur. 

Lorsque Google appelle l'URL de rappel, il fournit une code dans la chaîne de requête que vous pouvez utiliser pour échanger un jeton d'accès et un jeton d'identification. Le jeton d'identification est un JWT qui contient des informations d'identité sur l'utilisateur, y compris l'adresse électronique.

Voir plus d'informations ici: https://developers.google.com/identity/protocols/OpenIDConnect

3
Chen Pang

Il s’agit en fait d’un défi car Google ne fournit pas d’e-mail par défaut. Vous devez spécifiquement le demander à Google Plus.

const scope = [
  'https://www.googleapis.com/auth/plus.me', // request access here
  'https://www.googleapis.com/auth/userinfo.email',
];

auth.generateAuthUrl({
  access_type: 'offline',
  Prompt: 'consent',
  scope: scope,
});

const plus = google.plus({ version: 'v1', auth });
const me = await plus.people.get({ userId: 'me' });
const userEmail = me.data.emails[0].value;

Il existe une version complète dans ce billet de blog que j'ai écrit: https://medium.com/@jackscott/how-to-use-google-auth-api-with-node-js-888304f7e3a0

2
Jack

J'ai suivi la réponse de Prisoner juste au-dessus, et cela m'a aidé ... jusqu'à ce que je reçoive un courrier électronique des développeurs Google sur la fermeture de l'API Google+ le 7 mars 2019.

J'ai cherché et trouvé cette solution pour obtenir le courrier électronique à l'aide d'un id_token qui est renvoyé lorsque vous autorisez une application avec la portée email sur votre console de développeur.

À partir de Connexion Google pour les sites Web :

Pour valider un jeton d'identification en PHP, utilisez la bibliothèque cliente de l'API Google pour PHP. Installez la bibliothèque (par exemple, en utilisant Composer):

composer require google/apiclient

Ensuite, appelez la fonction verifyIdToken (). Par exemple:

require_once 'vendor/autoload.php';

// Get $id_token via HTTPS POST.

$client = new Google_Client(['client_id' => $CLIENT_ID]);  // Specify the CLIENT_ID of the app that accesses the backend
$payload = $client->verifyIdToken($id_token);
if ($payload) {
  $userid = $payload['sub'];
  // If request specified a G Suite domain:
  //$domain = $payload['hd'];
} else {
  // Invalid ID token
}

Cela renverra un tableau contenant les informations sur l'utilisateur, ainsi que l'adresse électronique de l'utilisateur qui s'est connecté. J'espère que cela aidera tout le monde.

1
NxKai

https://developers.google.com/gmail/api/v1/reference/users/getProfile

Pour gmails api, ajoutez ceci au code nodejs: 

function getUsersEmail (auth) {
  const gmail = google.gmail({version: 'v1', auth})
  gmail.users.getProfile({
    userId: 'me'
  }, (err, {data}) => {
    if (err) return console.log('The API returned an error: ' + err)
    console.log(data.emailAddress)
  })
}

Gmails api: https://developers.google.com/gmail/api/guides/

0