PassportJS 给了我令牌,但是 returns 401 Unauthorized

PassportJS gives me the tokens but returns a 401 Unauthorized

我正在为访问 Google API v3 的桌面应用程序编写网络服务器,为此我需要使用他们的 oAuth 2.0。

网络服务器将 PassportJS 与 passport-google-oauth20 策略结合使用,它可以正常工作,因为我收到了访问令牌和刷新令牌。

我不打算保留用户数据,也不需要桌面应用程序的 cookie。我真正需要的是 accessToken 和 refreshToken 这样用户就不需要每次都登录了。

到目前为止一切顺利,但是在 Google 发送令牌后,它不知何故失败了?我很确定发送 401 的不是 Google 而是我设置它的方式。

我试过了 但这对我不起作用,因为我需要令牌。

这是策略设置:

const passport = require("passport");
const GoogleStrategy = require('passport-google-oauth20').Strategy;

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.CLIENT_ID,
      clientSecret: process.env.CLIENT_SECRET,
      callbackURL: "/oauth/callback"
    },
    (accessToken, refreshToken, _, done) => {
      console.log("access token: ", accessToken);
      console.log("refresh token: ", refreshToken);
      done(null, null)
    }
  )
);

这里是服务器的相关部分

server.get("/authorized", (req, res) => res.send("Login Succeeded"));
server.get("/fail", (req, res) => res.send("Login Failed"));

server.get(
  "/oauth",
  passport.authenticate("google", {
    scope: ["https://www.googleapis.com/auth/drive.file", "email"],
    accessType: "offline",
    approvalPrompt: "force",
  })
);

server.get(
  "/oauth/callback",
  passport.authenticate("google", {
    successRedirect: "/authorized",
    failureRedirect: "/fail",
    failureFlash: true,
    failWithError: true,
  })
);

如果你想亲眼看看,here is a snippet repo

在您的策略回调中,您需要为通过身份验证的用户提供 Passport,否则它将认为这是一次失败的身份验证尝试。

通过将 done() 更新为以下内容,我能够使您的代码正常工作并重定向到 authorized 路由:

    (accessToken, refreshToken, _, done) => {
      console.log("access token: ", accessToken);
      console.log("refresh token: ", refreshToken);
      done(null, _)
    }