Mik*_*ras 9 javascript passport.js
我正在使用passport.js来验证用户身份.我希望能够传递从用户收集的用户名,该用户名将在验证过程结束时通过,这样我就可以在创建用户时存储用户名(如果它尚不存在).我试过这个:
app.get("/auth/google", function(request, response)
{
console.log(request.query.username);
passport.authenticate("google",
{
scope:
[
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email"
]
})(request, response);
});
app.get("/auth/google/callback", function(request, response)
{
console.log(request.query.username);
passport.authenticate("google",
{
successRedirect: "/",
failureRedirect: "htm/error"
})(request, response);
});
Run Code Online (Sandbox Code Playgroud)
对/ auth/google的调用打印用户名,但回调打印未定义.即使我可以获得回调用户名,我仍然不确定如何获得谷歌策略.那么我是否必须制定自己的战略来实现这一目标?
小智 10
您可以将状态对象传递给passport.authenticate,如下所示:
passport.authenticate("google",
{
scope:
[
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email"
],
state: request.query.username
})(request, response);
Run Code Online (Sandbox Code Playgroud)
您可以通过req.query.state访问该状态.
用户名应该是字符串,而不是对象.如果要在状态中存储对象,请先调用JSON.stringify并在回调中解析它.
对于使用 OpenID 的任何人,req.query 似乎被 OpenId 查询参数覆盖,因此无法直接传递。但是,您可以将变量附加到 req.session。
router.get('/auth/social', (req, res, next) => {
req.session.foo = req.query.foo;
next();
}, passport.authenticate('social'));
Run Code Online (Sandbox Code Playgroud)
并且不要忘记在策略选项中包含 passReqToCallback 标志:
{
passReqToCallback: true,
returnURL: config.app.returnUrl,
realm: config.app.realm,
apiKey: config.app.apiKey
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4956 次 |
| 最近记录: |