我有一个nodejs服务器,它实现了用于用户身份验证的Google OAuth2。服务器启动后,用户可以立即登录。但是,登录/注销10次后,oauth2Client.getToken(code)
函数将开始卡住,并最终返回错误{ error: 'invalid_grant', error_description: 'Bad Request' }
。重新启动服务器,登录/注销可以再工作10次。
以下是用于用户身份验证的代码。
// index.js
// Node version: Docker, node:alpine
// googleapis Version: 46.0.0
const { google } = require("googleapis");
const express = require("express");
const app = express();
const oAuth2Client = new google.auth.OAuth2(
process.env.GOOGLE_OAUTH2_CLIENT_ID,
process.env.GOOGLE_OAUTH2_CLIENT_SECRET,
process.env.GOOGLE_OAUTH2_REDIRECT_URI // http://localhost:3000/signin-google
);
app.get("/signin", (req, res) => {
const url = oAuth2Client.generateAuthUrl({
access_type: "offline",
scope: [
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile",
"openid"
].join(" ")
});
res.json({ url });
});
app.get("/signin-google", async (req, res) => {
try {
const { code } = req.query;
const { tokens } = await oAuth2Client.getToken(code);
oAuth2Client.setCredentials(tokens);
const oauth2 = google.oauth2("v2");
const {
data: { email, id: google_id }
} = await oauth2.userinfo.v2.me.get({
auth: oAuth2Client
});
const myOwnToken = ...
res.redirect(`${process.env.WEB_BASE_URL}/signin?token=${myOwnToken}`);
} catch (error) {
console.log(JSON.stringify(error, null, 4));
}
});
太奇怪了!好像我错过了一些限制问题,但是...无法解决!有任何想法吗?谢谢。
答案 0 :(得分:0)
我的天哪,我太傻了,这个错误完全不是由Google OAuth引起的,这仅仅是因为我忘记了关闭数据库连接。