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. Я видел это только один раз, и в прошлом это работало хорошо.

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

  1. Документация API Google о переходе на Google+ вход.
  2. https://www.googleapis.com/auth/userinfo.email область действия
  3. Документация о людских ресурсах
  4. Добавьте google+ api в проект с помощью консоли разработчика Google. Количество бесплатных звонков (квота) довольно велико (20 м для google+ вход в api в день).
  5. Добавьте обработку ошибок и регистрацию в коде сервера, если 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)
  })
}

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

Изменить authorizationRequest с заданной областью: scope=openid%20email%20profile и использовать userinfoapi. Эта ссылка работала для меня

Другие вопросы по тегам