Логин Google с React и Node.js не возвращает запрошенную область - PullRequest
0 голосов
/ 21 марта 2020

Мне нужны дополнительные данные области из Google API в логин в моем приложении. Я использую react-google-login для получения токена в приложении React с использованием следующих областей:

scope='https://www.googleapis.com/auth/user.birthday.read https://www.googleapis.com/auth/user.addresses.read https://www.googleapis.com/auth/user.organization.read'

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

Я отправляю этот токен в бэкэнд (Node.js), где я использую google-auth-library для получения полезной нагрузки от токена:

import { OAuth2Client } from 'google-auth-library'

export const validateGoogleAccessTokenOAuth2 = async (idToken: string): Promise<any> => {
    const CLIENT_ID = 'MY_ID'
    const client = new OAuth2Client(CLIENT_ID)

    const ticket = await client.verifyIdToken({
        idToken,
        audience: CLIENT_ID
    })
    const payload = ticket.getPayload()

    return payload
}

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

Есть ли что-то, что я делаю неправильно, или есть другой способ получить запрошенную переменную области видимости? из токена?

1 Ответ

0 голосов
/ 25 марта 2020

После некоторых исследований я обнаружил, что

  • атрибуты дня рождения и пола не включены в полезную нагрузку функции publi c token
  • client.verifyIdToken, просто подтвердите idToken и вернитесь его полезная нагрузка
  • для получения дополнительной информации о пользователе, в этом случае вы должны использовать People API

Для связи с People API вы можете использовать пакет googleapis npm, кроме того, вам необходимо выполнить следующие условия:

  • Добавить People API к вашему проекту в консоли разработчика Google

  • Добавить дополнительную область к вашему вызову FE в Google (в моем случае https://www.googleapis.com/auth/user.birthday.read)

  • вы должны отправить idToken и AccessToken в бэкэнд-сервис
  • пользователь должен разрешить указывать пол в вашем приложении
  • пол пользователя должен быть установлен как publi c в профиле google пользователя

BE пример

import { google } from 'googleapis'
import { OAuth2Client } from 'google-auth-library'

export const validateGoogleAccessToken = async (idToken, accessToken) => {
    try {
        const CLIENT_ID = 'YOUR_GOOGLE_APP_CLIENT_ID'
        const client = new OAuth2Client(CLIENT_ID)

        const ticket = await client.verifyIdToken({
            idToken,
            audience: CLIENT_ID
        })

        const payload = ticket.getPayload()

        const { OAuth2 } = google.auth
        const oauth2Client = new OAuth2()
        oauth2Client.setCredentials({ access_token: accessToken })

        const peopleAPI = google.people({
            version: 'v1',
            auth: oauth2Client
        })

        const { data } = await peopleAPI.people.get({
            resourceName: 'people/me',
            personFields: 'birthdays,genders',
        })

        const { birthdays, gender } = data

        return {
            ...payload // email, name, tokens
            birthdates, // array of birthdays
            genders, // array of genders
        }
    } catch (error) {
        throw new Error('Google token validation failed')
    }
}

...