如何同时使用 bearer 和 oauth2 passport.js 策略?

6

最近我开始使用passport.js和oauth2策略进行身份验证。起初,我使用会话(session)一切都很顺利,但我希望我的API是无状态的。我发现唯一可以帮助我的是bearer策略(passport-http-bearer)。但我找不到任何好的例子来同时使用这两种策略,所以我有点迷茫。也许我走错了路。让我解释一下我想做什么。

假设我已经像这样配置了google策略(passport-google-oauth2):

  passport.use(
    new GoogleStrategy(
      {
        clientID: <googleClientId>,
        clientSecret: <googleClientSecret>,
        callbackURL: `localhost:4000/auth/google/callback`,
        scope: ["profile", "email"],
      },
      async function (_accessToken, _refreshToken, profile, done) { // this is the verify function
        let user = <create new user>
        return done(null, user);
      }
    )
  );

该路由将用户重定向到Google进行身份验证:

app.get("/auth/google", passport.authenticate("google", { session: false }));

这个函数处理响应并登录用户:

app.get(
  "/google/callback",
  passport.authenticate("google", {
    session: false,
  })
);

谷歌策略生成一个令牌,我想将该令牌返回给用户,以便我可以将其存储在客户端的本地存储中,并在每个请求的Authorization头中发送以验证用户身份。我的第一个问题是在哪里以及如何返回?我可以在策略的验证令牌中访问令牌,但我不知道应该如何在响应体中将其返回给用户。

我使用承载策略(passport-http-bearer)来保护需要已认证用户的路由。我已按以下方式进行了配置:

passport.use(
  new BearerStrategy(async function (token, done) { // this is the verify function
    const user = await userManager.find({ oauthToken: token });
    return done(null, user);
  }) 
);

verify函数的第一个参数是位于Authorization头中的令牌。当用户使用Google注册时,我会将发出的令牌保存在数据库中(假设令牌是“1234”)。用户应该在Authorization头中发送他们的令牌(如“Bearer 1234”),如果该令牌存在于数据库中,则用户得到验证。

现在,我可以使用Bearer策略来保护路由:

app.get(
  "/protected",
  passport.authenticate("bearer", { session: false }),
  (req: Request, res: Response) => {
    res.send({ data: req.user });
  }
);

将Google OAuth令牌保存在数据库中是否可以?我需要刷新它吗?您认为我正在尝试的整个过程怎么样?我来自jwt世界,这对我来说很奇怪。

1个回答

2

我进行了更多的研究,现在对OAuth2有了更好的理解。显然,这是不可能的。访问令牌是在后端生成的,出于安全原因,应该保留在后端。我可以在前端访问它,但这样会有一些权衡,因此我回到了经典的基于会话的解决方案。观看以下演讲对我帮助很大:https://www.youtube.com/watch?v=996OiexHze0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接