【发布时间】: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