最近我开始使用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世界,这对我来说很奇怪。