【问题标题】:How to pass extra data in passport-facebook authentication如何在护照-facebook 身份验证中传递额外数据
【发布时间】:2016-10-22 16:25:32
【问题描述】:

我正在尝试在Node.js 中编写一个使用passport-facebook 身份验证策略的Web 应用程序。默认情况下,示例中提供的机制通过将用户重定向到Facebook API 来工作,用户可以在其中输入用户名和密码以登录。一旦 Facebook 验证了用户,它会将令牌传递回我的应用程序中的回调 URL。

现在这些东西适用于我的应用程序。我可以毫无问题地使用 Facebook 登录。但我希望在尝试登录时向服务器传递一个额外的字段。

基本上我的计划是在我的主页上添加一个TextField 和一个Login Button。登录成功后,当回调函数执行时,我想从这个回调中获取TextField的值。有没有办法做到这一点?非常感谢任何帮助。

这是我的 HTML 页面的正文

<body>
    <div class="container">

        <div class="jumbotron text-center">
            <p>Login or Register with:</p>
            <a href="/auth/facebook" class="btn btn-primary"><span class="fa fa-facebook"></span> Facebook</a>
        </div>
    </div>
</body>

这是我的nod.js 代码:

app.get('/auth/facebook', passport.authenticate('facebook'));

app.get('/auth/facebook/callback', passport.authenticate('facebook', {
    successRedirect :   '/dashboard',
    failureRedirect :   '/'
}));

app.get('/dashboard', isLoggedIn, function(req, res){
    res.render('dashboard.ejs', {
        user : {
            name : req.user.facebook.name,
            profilePic : req.user.facebook.profilePic
        }
    });
});

基本上我只想在我的LogIn 按钮之前添加一个额外的TextField。从/dashboard 路由中,我想得到TextField 的值。所以我的/dashboard 代码看起来像这样:

app.get('/dashboard', isLoggedIn, function(req, res){
    res.render('dashboard.ejs', {
        user : {
            role:   VALUE_FROM_TEXT_FIELD,
            name : req.user.facebook.name,
            profilePic : req.user.facebook.profilePic
        }
    });
});

所以我有一个双重问题: 1. 如何从前端传递这个TextField 值。它应该在Form 内还是什么? 2、如何获取/dashboard路由内TextField的值?

【问题讨论】:

  • 你能举一些你工作的例子吗?我怀疑你应该能够使用回调 url 来回传这个

标签: javascript node.js passport.js passport-facebook


【解决方案1】:

您是否考虑过使用自定义回调而不是标准的 Passport.js 回调?

“本地”策略的一个示例是:

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

您应该能够在请求中传递附加值并在回调中处理它。

编辑:对于您的特定场景,您可能正在查看类似的内容...

app.get('/auth/facebook/callback', function (req, res, next) {
    passport.authenticate('facebook', function (err, user, info) {
        if (err) {
            return next(err);
            // let the next route handler do its thing...
            // or you can handle the error yourself within this
            // callback.
        }

        // if the user returns as nothing (doesn't exist) then redirect
        if (!user) {
            // this takes the place of failureRedirect
            return res.redirect('/');
        }
        req.logIn(user, function (err) {
            if (err) {
                return next(err); // again - on error, 'next' depending on your requirement.
            }
            // this takes the place of successRedirect
            return res.redirect('/dashboard');
        });
    })(req, res, next);
});

希望这可以澄清:)

【讨论】:

  • 我已经编辑了我的问题。你能告诉我如何在给定的场景中获取数据吗?我能够像您的示例一样使用自定义回调,并且可以从 req 对象获取数据。但是对于我的示例,我需要登录成功后的数据。
  • 已更新。希望这会有所帮助。
  • 道歉。刚刚意识到我错过了你正在做的事情的重点。您能分享一下您是如何配置策略的吗? IE。 passport.use(new FacebookStrategy(..)
【解决方案2】:

我所做的是传递一个自定义函数而不是使用 sucessRedirect 并将其传递给需要的变量。在我的情况下,它是 req.session.backurl 用于将他们发送回他们需要通过身份验证才能访问的页面。

users.get('/auth/facebook/callback',
         //req.session.backURL||
  passport.authenticate('facebook', { failureRedirect: '/login' }),function(req,res){
res.redirect(req.session.backURL||'/'); //custom function used instead of sucessRedirect

});

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2013-08-26
    • 2019-03-25
    • 2015-08-21
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多