Подтвердить что ты не робот

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

Я играю с 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 и области видимости, которая последовательно предоставляет адрес электронной почты пользователя.

4b9b3361

Ответ 1

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

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

userinfo точка 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. Это должно дать вам поле электронной почты, содержащее массив адресов. В вашем случае, скорее всего, будет только тот, который имеет тип "аккаунт".

Ответ 3

Вам нужно добавить область 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>

Ответ 4

Я пришел сюда, глядя, почему мой сервер не получил электронную почту в ответ на вызов /oauth 2/v2/userinfo api. Только однажды я увидел это, и он хорошо работал в прошлом.

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

Ответ 5

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

Когда Google вызывает URL-адрес обратного вызова, он предоставляет code в строке запроса, который можно использовать для обмена на токен доступа и токен идентификатора. Идентификационный токен - это JWT, который содержит идентификационную информацию о пользователе, включая адрес электронной почты.

Дополнительную информацию смотрите здесь: https://developers.google.com/identity/protocols/OpenIDConnect.

Ответ 6

На самом деле это немного сложная задача, поскольку 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;

Ответ 7

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

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

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

Чтобы проверить идентификационный токен в 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
}

Это вернет массив, содержащий информацию о пользователе, который также содержит адрес электронной почты пользователя, который вошел в систему. Надеюсь, это поможет кому-то еще.