Arm*_*man 6 authentication node.js oauth-2.0 passport.js passport-google-oauth2
最近我开始使用 Passport.js 和 oauth2 策略进行身份验证。起初,我使用会话,一切都很棒,但我希望我的 API 是无状态的。我发现唯一可以帮助我解决这个问题的是承载策略(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);
}
)
);
Run Code Online (Sandbox Code Playgroud)
此路由将用户重定向到谷歌,他们将在其中进行身份验证:
app.get("/auth/google", passport.authenticate("google", { session: false }));
Run Code Online (Sandbox Code Playgroud)
这个处理响应并让用户登录:
app.get(
"/google/callback",
passport.authenticate("google", {
session: false,
})
);
Run Code Online (Sandbox Code Playgroud)
Google 策略发出一个不记名令牌,我想将该令牌返回给用户,以便我可以将其存储在客户端的 localStorage 中,并将其发送到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);
})
);
Run Code Online (Sandbox Code Playgroud)
验证函数的第一个参数是标头中的令牌Authorization
。当用户使用谷歌注册时,我将颁发的令牌保存在数据库中(假设它是“1234”)。用户应在标头中发送其令牌Authorization
(例如“Beader 1234”),如果令牌位于数据库中,则他们将通过身份验证。
现在我可以使用承载策略保护路由:
app.get(
"/protected",
passport.authenticate("bearer", { session: false }),
(req: Request, res: Response) => {
res.send({ data: req.user });
}
);
Run Code Online (Sandbox Code Playgroud)
将 google OAuth 令牌保存在数据库中可以吗?我需要刷新它吗?您对我尝试做的整个过程有何看法?我来自 jwt 世界,它已为我连线。
嗯,我做了更多研究,现在我对 OAuth2 有了更好的理解。显然,这是不可能的。访问令牌在后端生成,出于安全原因应保留在后端。我可以在前端访问它,但需要权衡,所以我回到了经典的基于会话的解决方案。观看以下演讲对我帮助很大:https://www.youtube.com/watch?v =996OiexHe0
归档时间: |
|
查看次数: |
824 次 |
最近记录: |