首页 > 解决方案 > 登录/退出 10 次后,Google oauth2Client getToken 返回 invalid_grant, Bad Request

问题描述

我有一个 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));
  }
});

太奇怪了!好像我错过了一些限制问题,但是......就是想不通!有任何想法吗?谢谢。

标签: node.jsgoogle-oauth

解决方案


Oh my god I'm soooo troll, this error is totally not caused by the Google OAuth, it's just because I forgot to close the database connection.


推荐阅读