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 и области видимости, которая последовательно предоставляет адрес электронной почты пользователя.
Ответы
Ответ 1
Обновление: декабрь 2018
20 декабря Google объявил, что API Google+ будет отключен в марте 2019 года, с прерывистым отказом, начинающимся в конце января 2019 года. Как часть конечной точки plus.people.get
устарела и должна быть прекращена.
userinfo
точка userinfo
устарела (см. Пояснение) и должна предоставлять информацию, если
- Вы запрашиваете
https://developers.google.com/identity/sign-in/web/devconsole-project
область действия и - Вы запрашиваете поле
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
. Это должно дать вам поле электронной почты, содержащее массив адресов. В вашем случае, скорее всего, будет только тот, который имеет тип "аккаунт".
Ответ 2
По состоянию на 2017 год: используйте область email
. См. Авторизация запросов API.
Эта область электронная почта эквивалентна и заменяет https://www.googleapis.com/auth/userinfo.email область.
![введите описание изображения здесь]()
Ответ 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
}
Это вернет массив, содержащий информацию о пользователе, который также содержит адрес электронной почты пользователя, который вошел в систему. Надеюсь, это поможет кому-то еще.
Ответ 8
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/