为了账号安全,请及时绑定邮箱和手机立即绑定

使用 React 和 Node.js 登录的 Google 不会返回请求的范围

使用 React 和 Node.js 登录的 Google 不会返回请求的范围

开满天机 2022-05-26 10:19:46
在我的应用程序中登录时,我需要来自 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}在这里,我只收到来自配置文件和电子邮件范围的数据,没有来自请求范围的数据。特别是我需要生日,我还检查了我的谷歌个人资料中允许任何人访问但没有帮助。我做错了什么还是有另一种方法如何从令牌中获取请求的范围变量?
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

经过一番研究,我发现

  • 生日和性别属性不包含在公共令牌的有效负载中

  • client.verifyIdToken函数只是验证idToken并返回它的有效载荷

  • 要获取有关用户的其他信息,在这种情况下,您必须使用People API

要与 People API 通信,您可以使用googleapisnpm 包,您还必须满足以下条件:

  • People API在 Google Developer Console 中添加到您的项目

  • 为您对谷歌的 FE 调用添加额外的范围(在我的情况下https://www.googleapis.com/auth/user.birthday.read

  • 你必须发送idTokenAccessToken你的后端服务

  • 用户必须允许与您的应用程序共享性别

  • 用户的性别必须在用户的谷歌个人资料中设置为公开

做例子

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')

    }

}


查看完整回答
反对 回复 2022-05-26
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信