PassportJS给了我令牌,但返回了401未经授权的

时间:2020-07-31 12:47:18

标签: node.js express passport.js google-oauth

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

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

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

到目前为止,一切都很好,但是Google发送令牌后,它以某种方式失败了吗?我敢肯定不是Google发送的是401,而是我设置的方式。

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

这是策略设置:

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

1 个答案:

答案 0 :(得分:1)

在策略回调中,您需要向Passport提供经过身份验证的用户,否则它将被视为身份验证尝试失败。

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

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