【问题标题】:Expressjs: google-auth-libary id-token verification "token used too late number > number..."Express Js:google-auth-library id-token 验证“token used too late number > number...”
【发布时间】:2021-09-28 14:36:49
【问题描述】:

我尝试为我的 reactjs/expressjs 网络应用添加 google auth login。在前端我使用 react-google-login 包:

import React from "react"
import { GoogleLogin } from "react-google-login"
import { useHistory } from "react-router-dom"

const axios = require('axios')

export default function LoginButton() {
    let history = useHistory()
    const { REACT_APP_GOOGLE_CLIENT_ID, REACT_APP_API_URL } = process.env

    const onSuccess = async (response) => {
        console.log(response)
        const data = { token: response.tokenId }
        const res = await axios.post(REACT_APP_API_URL + "/auth/google", data, {
            'Content-Type' : 'text/json'
        })
            .then((res) => {
                history.push('/home')
            })
            .catch((err) => {
                console.log("[LOGIN FAILED]")
            })
    }

    const onFailure = (response) => {
        console.log(response)
    }
    return(
        <GoogleLogin 
            clientId={REACT_APP_GOOGLE_CLIENT_ID}
            buttonText="Log in with Google"
            onSuccess={onSuccess}
            onFailure={onFailure}
            cookiePolicy={'single_host_origin'}
        />
    )
}

看来我从这个按钮获得了正确的数据。我将令牌发送到 expressjs api。这是我遇到问题的地方。使用 google-auth-library 验证令牌时出现错误:“错误:令牌使用太晚,number_1 > number_2”。据我所知,idToken 已过期,但考虑到我尽快从前端发送它,这不是很奇怪。后端代码:

const { OAuth2Client } = require('google-auth-library')
require('dotenv').config()
const client = new OAuth2Client(process.env.CLIENT_ID)


const postGoogleLogin = async (req, res) => {
    const { token } = req.body
    try{
        const ticket = await client.verifyIdToken({
            idToken: token,
            audience: process.env.CLIENT_ID
        })
        
        const { name, email, picture } = ticket.getPayload()

        res.status(201).json({
            name: name,
            email: email,
            picture: picture
        })
    }
    catch(e){
        console.log(e)
    }   
}

我已尝试使用端点 https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123 验证令牌,该端点表示令牌有效,但据我所知,此端点不应在生产中使用

【问题讨论】:

    标签: node.js reactjs express google-oauth


    【解决方案1】:

    问题似乎来自图书馆本身。只要您在 React 和 ExpressJs 上使用相同的客户端 ID,只要令牌仍然有效,verifyIdToken 就应该返回成功响应。

    此外,您可以在生产代码中使用https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

    在内部,库调用相同的端点来验证您的令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2021-12-29
      • 2021-06-21
      • 1970-01-01
      • 2015-11-17
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多