web-dev-qa-db-ja.com

Google OAuth AP​​Iはユーザーのメールアドレスを取得しますか?

自分の個人的な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とスコープの組み合わせを見つけることができません。

53
RevolutionTech

2017年時点:emailスコープを使用します。 APIリクエストの認証 をご覧ください。

このemailスコープは https://www.googleapis.com/auth/userinfo.email スコープと同等であり、これに代わるものです。

enter image description here

43
turdus-merula

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>
13
Tom

ここに来て、サーバーが/ oauth2/v2/userinfo api呼び出しへの応答で電子メールを受け取らなかった理由を探しました。私がこれを見たのは一度だけで、過去にうまく機能していました。

答えは良いリードを与えました。これを修正している間、他にも役立つリソースがいくつかありました。それでも、応答で常に電子メールを期待することが大丈夫かどうかはわかりません。そう-電子メールが返されない場合に備えて、コードにエラー処理を配置します。

  1. google +サインインへの移行 に関するGoogle APIドキュメント。
  2. https://www.googleapis.com/auth/userinfo.email scope
  3. 人材リソース ドキュメント
  4. google developer console を使用して、google + apiをプロジェクトに追加します。通話の無料(割り当て)は非常に高い(google +サインインAPIで1日あたり20m)。
  5. APIがメールを返さない場合に備えて、サーバーコードにエラー処理とログ記録を追加します。私の場合、type = 'account'メールのみを探していました。
6
Sushil

OAuth 2.0を使用してGoogleにサインインする場合、ユーザーのメールを取得するために別のリクエストを行う必要はありません。

GoogleがコールバックURLを呼び出すと、アクセストークンとIDトークンの交換に使用できるクエリ文字列にcodeが提供されます。 IDトークンは、電子メールアドレスを含むユーザーに関するID情報を含むJWTです。

詳細はこちらをご覧ください: https://developers.google.com/identity/protocols/OpenIDConnect

3
Chen Pang

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

1
Jack

私は上記の囚人の回答をフォローしてきましたが、それは助けになりました... 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
}

これは、ユーザー情報を含む配列を返します。この配列には、ログインしたユーザーの電子メールも含まれます。これが他の人にも役立つことを願っています。

1
NxKai

authorizationRequestを特定のスコープで変更します:scope=openid%20email%20profileおよびuserinfoapiを使用します。 このリンクは私のために働いた

0
Saghi

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

Gmail API: https://developers.google.com/gmail/api/guides/

0