it-swarm.com.ru

Google OAuth API, чтобы получить адрес электронной почты пользователя?

Я играю на Google OAuth 2.0 Playground, используя свою личную учетную запись Google, но я не могу восстановить свой адрес Gmail, используя игровую площадку.

Я использую область действия:

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

Но когда я вызываю API:

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

Я получаю различную информацию о пользователе, такую ​​как фамилия, имя, пол, фотография и т.д., Но он не возвращает электронную почту пользователя.

Как мне получить адрес электронной почты пользователя? У меня неправильная область или я вызываю неправильный API? Я чувствую, что это должно быть очень просто, но я буквально пытался выяснить это часами, и я не могу найти комбинацию API и области, которая последовательно предоставляет адрес электронной почты пользователя.

36
RevolutionTech

Обновление: декабрь 2018 г.

20 декабря Google объявил, что API Google+ будет закрыт в марте 2019 года, при этом прерывистый сбой начнется в конце января 2019 года. Как часть конечной точки plus.people.get устарела и должна быть прекращена.

Конечная точка userinfo устарела (см. Пояснение) и должна предоставлять информацию в предположении

  1. Вы запрашиваете область https://developers.google.com/identity/sign-in/web/devconsole-project и
  2. Вы запрашиваете поле email.

Уточнение: 24 января 2019 года

Google зарегистрировано , что конечная точка userinfo (v2) устарела, но позже изменила ее на «устарела, но оставлена ​​доступной для обратной совместимости».

Текущая документация обсуждает получение профиля и информации электронной почты с помощью поддерживаемого в настоящее время метода openid. Это включает в себя использование конечной точки «userinfo», указанной в их документ обнаружения , как того требует OpenID Connect.

На данный момент этот URL-адрес - https://openidconnect.googleapis.com/v1/userinfo, но в прошлом он изменился, и документ об обнаружении на https://accounts.google.com/.well-known/openid-configuration является официальным источником для использования URL-адреса.

Итак, чтобы быть ясным:

  • Старый URL-адрес пользователя сохраняется для обратной совместимости
  • Новый URL-адрес пользователя доступен в документе обнаружения

В любом случае, положительная версия чего-либо (описанного ниже) является устарела и должна быть удалена .

Оригинальный ответ

Здесь много вопросов о том, что вы делаете и как вы пытаетесь это сделать.

Начнем с того, что конечная точка https://www.googleapis.com/oauth2/v2/userinfo устарела и должна быть удалена в сентябре 2014 года. Она начала работать непоследовательно, поэтому не используйте ее.

Как отметил @abraham, вы будете использовать конечную точку people.get в https://www.googleapis.com/plus/v1/people/me. Это должно дать вам поле emails , содержащее массив адресов. В вашем случае, скорее всего, будет только тот, который имеет тип «аккаунт».

45
Prisoner

Начиная с 2017 года: используйте область email. См. Авторизация запросов API .

Эта область email эквивалентна и заменяет https://www.googleapis.com/auth/userinfo.email scope.

 enter image description here

40
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>
10
Tom

Я пришел сюда, чтобы посмотреть, почему мой сервер не получил письмо в ответ на вызов API/oauth2/v2/userinfo. Я видел это только один раз, и в прошлом это работало хорошо. 

Ответ дал хорошее руководство. Исправляя это, было несколько других ресурсов, которые помогли. Тем не менее я не уверен, что ожидание всегда электронной почты в ответе в порядке. Итак - включите обработку ошибок в код, если письма не возвращаются.

  1. Документация API Google о переходе на google + вход .
  2. https://www.googleapis.com/auth/userinfo.email scope
  3. Народный ресурс документация
  4. Добавьте google + api в проект, используя консоль разработчика Google . Количество бесплатных звонков (квота) довольно велико (20 м для google + вход в api в день).
  5. Добавьте обработку ошибок и регистрацию в коде сервера на случай, если api не вернет электронную почту. В моем случае я искал только электронную почту type = 'account'. 
6
Sushil

Для входа в Google с помощью OAuth 2.0 нет необходимости делать отдельный запрос для получения электронной почты пользователя. 

Когда Google вызывает URL-адрес обратного вызова, он предоставляет code в строке запроса, которую можно использовать для обмена на токен доступа и токен идентификатора. Идентификационный токен - это 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-888304f7e3a0

2
Jack

Я следил за ответом Prisoner прямо выше, и это помогло мне ... до тех пор, пока я не получил электронное письмо от разработчиков Google о том, как Google API будет закрыт 7 марта 2019 года.

Я искал и нашел это решение для получения электронной почты, используя id_token, который возвращается, когда вы авторизуете приложение с областью email на консоли разработчика.

С Google Войти для веб-сайтов :

Чтобы проверить токен ID в PHP, используйте клиентскую библиотеку Google API для PHP. Установите библиотеку (например, с помощью 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

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

Для gmails 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)
  })
}

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

0
Ezequiel Wernicke