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 и области, которая последовательно предоставляет адрес электронной почты пользователя.
13 ответов
Здесь много вопросов о том, что вы делаете и как вы пытаетесь это сделать.
Для начала, https://www.googleapis.com/oauth2/v2/userinfo
конечная точка устарела и должна быть удалена в сентябре 2014 года. Она начала работать нестабильно, поэтому не используйте ее.
Как отметил @abraham, вы будете использовать конечную точку people.get на https://www.googleapis.com/plus/v1/people/me
, Это должно дать вам поле электронной почты, содержащее массив адресов. В вашем случае, скорее всего, будет только тот, который имеет тип "аккаунт".
По состоянию на 2017 год: используйте email
объем. См. Авторизация запросов API.
Эта область электронной почты эквивалентна и заменяет область https://www.googleapis.com/auth/userinfo.email.
Для входа в Google с помощью OAuth 2.0 нет необходимости делать отдельный запрос для получения электронной почты пользователя.
Когда Google вызывает URL обратного вызова, он предоставляет code
в строке запроса, которую можно использовать для обмена на токен доступа и токен идентификатора. Идентификационный токен - это JWT, который содержит идентификационную информацию о пользователе, включая адрес электронной почты.
Дополнительную информацию смотрите здесь: https://developers.google.com/identity/protocols/OpenIDConnect
Вы хотите добавить 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>
Чтобы получить адрес электронной почты, вам необходимо включить область: "https://www.googleapis.com/auth/userinfo.email", как указано в этом документе. Если эта область включена при генерации токена обновления, вы сможете получить адрес электронной почты аутентифицирующего пользователя, выполнив следующий запрос:
вы можете вызвать это со своим собственным токеном доступа, тогда вы получите ответ
https://www.googleapis.com/oauth2/v3/userinfo?access_token="YOUR_ACCESS_TOKEN"
ответ будет выглядеть так
{
"sub": "1057abc98136861333615xz",
"name": "My Name",
"given_name": "My",
"family_name": "Name",
"picture": "https://lh3.googleusercontent.com/a-/AOh14qiJarwP9rRw7IzxO40anYi4pTTAU_xseuRPFeeYFg",
"email": "MyName@gmail.com",
"email_verified": true,
"locale": "en"
}
или просто вы можете просто написать функцию
import requests
def get_user_email(access_token):
r = requests.get(
'https://www.googleapis.com/oauth2/v3/userinfo',
params={'access_token': access_token})
return r.json()
Я пришел сюда, чтобы посмотреть, почему мой сервер не получил электронную почту в ответ на вызов API /oauth2/v2/userinfo. Я видел это только один раз, и в прошлом это работало хорошо.
Ответ дал хорошее руководство. Исправляя это, было несколько других ресурсов, которые помогли. Тем не менее я не уверен, что ожидание всегда электронной почты в ответе в порядке. Итак - включите обработку ошибок в код, если письма не возвращаются.
- Документация API Google о переходе на Google+ вход.
- https://www.googleapis.com/auth/userinfo.email область действия
- Документация о людских ресурсах
- Добавьте google+ api в проект с помощью консоли разработчика Google. Количество бесплатных звонков (квота) довольно велико (20 м для google+ вход в api в день).
- Добавьте обработку ошибок и регистрацию в коде сервера, если api не возвращает электронных писем. В моем случае я искал только электронную почту type='account'.
На самом деле это немного сложная задача, поскольку 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
с помощью google nodejs sdk:
const {google} = require('googleapis');
const people = google.people({
version: "v1",
auth: oauth2Client,
});
const resGoogle = await people.people.get({
resourceName: "people/me",
personFields: "emailAddresses,names,photos",
});
Я следил за ответом Prisoner прямо выше, и он помог мне... пока я не получил электронное письмо от разработчиков Google о том, как 7 марта 2019 года будет закрыто API Google.
Я искал и нашел это решение, чтобы получить электронную почту, используя 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 }
Это вернет массив, содержащий информацию о пользователе, который также содержит адрес электронной почты пользователя, который вошел в систему. Надеюсь, это поможет кому-то еще.
См. Мой ответ на ту же проблему: как получить электронную почту после использования Google OAuth2 на C#?
- В вашей переменной области действия. Используйте значение "электронная почта", а не полный адрес https. Ключевые слова области в веб-ссылке разделены пробелами. Я решаю вашу проблему с помощью областей, написанных как: адрес электронной почты профиля openid.
Я предлагаю следующий минимальный код, который включает пакеты '* / userinfo.email' и '@ google-cloud / local-auth':
const path = require('path');
const { google } = require('googleapis');
const { authenticate } = require('@google-cloud/local-auth');
const scope = [
'https://www.googleapis.com/auth/userinfo.email'
];
async function runSample() {
const auth = await authenticate({
keyfilePath: path.join(__dirname, 'oauth2.keys.json'),
scopes: scope
});
google.options({ auth });
const dat = await google.oauth2('v2').userinfo.get()
console.log(dat.data.email);
}
if (module === require.main) {
runSample().catch(console.error);
}
module.exports = runSample;
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)
})
}
Изменить authorizationRequest
с заданной областью: scope=openid%20email%20profile
и использовать userinfoapi. Эта ссылка работала для меня