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.
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
https://developers.google.com/identity/sign-in/web/devconsole-project
etemail
.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:
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".
À 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.
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>
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.
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
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
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.
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/