如何通过passport.js链传递参数?

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并在回调中解析它.


Kil*_*izo 5

对于使用 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)