11

我正在使用 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);
});

对 /auth/google 的调用会打印用户名,但回调会打印 undefined。即使我可以将用户名获取到回调,我仍然不确定如何将其获取到谷歌策略。那么我是否必须制定自己的策略才能使其发挥作用?

4

2 回答 2

12

您可以将状态对象传递给 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);

您可以通过req.query.state访问状态。

用户名应该是一个字符串,而不是一个对象。如果要在状态中存储对象,请在之前调用JSON.stringify并在回调中对其进行解析。

于 2014-05-08T23:03:15.297 回答
5

对于使用 OpenID 的任何人,req.query 似乎被 OpenId 查询参数覆盖,因此无法直接传递。但是,您可以将变量附加到 req.session。

router.get('/auth/social', (req, res, next) => {
  req.session.foo = req.query.foo;
  next();
}, passport.authenticate('social'));

并且不要忘记在策略选项中包含 passReqToCallback 标志:

{
  passReqToCallback: true,
  returnURL: config.app.returnUrl,
  realm: config.app.realm,
  apiKey: config.app.apiKey
}
于 2017-01-13T14:10:24.477 回答