亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號