自分の個人的なGoogleアカウントを使用してGoogleのOAuth 2.0 Playgroundで遊んでいますが、遊び場を使用してGmailアドレスを回復できないようです。
私が使用しているスコープは次のとおりです。
email profile https://www.googleapis.com/auth/plus.login
しかし、APIを呼び出すと:
https://www.googleapis.com/oauth2/v2/userinfo
姓、名、性別、写真など、ユーザーに関するさまざまな情報を取得しますが、ユーザーのメールは返されません。
ユーザーのメールアドレスを取得するにはどうすればよいですか?間違ったスコープを持っていますか、それとも間違ったAPIを呼び出していますか?これは非常に簡単なはずですが、文字通り何時間もこれを把握しようとしており、ユーザーのメールアドレスを常に提供するAPIとスコープの組み合わせを見つけることができません。
2017年時点:email
スコープを使用します。 APIリクエストの認証 をご覧ください。
このemailスコープは https://www.googleapis.com/auth/userinfo.email スコープと同等であり、これに代わるものです。
https://www.googleapis.com/auth/userinfo.email
スコープを追加するか、https://www.googleapis.com/oauth2/v2/userinfo
をそれに置き換えます。それらが提供するHTMLの例を使用している場合は、スペースで区切られた複数のスコープをリストできます。
<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>
ここに来て、サーバーが/ oauth2/v2/userinfo api呼び出しへの応答で電子メールを受け取らなかった理由を探しました。私がこれを見たのは一度だけで、過去にうまく機能していました。
答えは良いリードを与えました。これを修正している間、他にも役立つリソースがいくつかありました。それでも、応答で常に電子メールを期待することが大丈夫かどうかはわかりません。そう-電子メールが返されない場合に備えて、コードにエラー処理を配置します。
OAuth 2.0を使用してGoogleにサインインする場合、ユーザーのメールを取得するために別のリクエストを行う必要はありません。
GoogleがコールバックURLを呼び出すと、アクセストークンとIDトークンの交換に使用できるクエリ文字列にcode
が提供されます。 IDトークンは、電子メールアドレスを含むユーザーに関するID情報を含むJWTです。
詳細はこちらをご覧ください: https://developers.google.com/identity/protocols/OpenIDConnect
Googleはデフォルトではメールを提供しないため、これは実際には少し難しいことです。 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;
私が書いたこのブログ投稿には完全版があります: https://medium.com/@jackscott/how-to-use-google-auth-api-with-node-js-888304f7e3a
私は上記の囚人の回答をフォローしてきましたが、それは助けになりました... Google Developersから2019年3月7日にGoogle+ APIがシャットダウンされる方法についてのメールを受け取るまで。
開発者コンソールでemail
スコープを使用してアプリを承認すると返されるid_token
を使用して電子メールを取得するこのソリューションを探しました。
から ウェブサイトへのGoogleサインイン :
PHPでIDトークンを検証するには、PHP用のGoogle APIクライアントライブラリを使用します。ライブラリをインストールします(たとえば、Composerを使用)。
composer require google/apiclient
次に、verifyIdToken()関数を呼び出します。例えば:
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 }
これは、ユーザー情報を含む配列を返します。この配列には、ログインしたユーザーの電子メールも含まれます。これが他の人にも役立つことを願っています。
authorizationRequest
を特定のスコープで変更します:scope=openid%20email%20profile
およびuserinfoapiを使用します。 このリンクは私のために働いた
https://developers.google.com/gmail/api/v1/reference/users/getProfile
Gmail APIの場合、これを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)
})
}