Passport.js:passport-facebook-token策略,通过JS SDK登录,THEN验证护照?

mat*_*sdv 22 node.js facebook-javascript-sdk facebook-oauth passport-facebook passport.js

我正在寻找一种方法让我的客户端使用facebook JS SDK进行授权,然后以某种方式将此授权转移到我的节点服务器(因此它可以使用fb graph api验证请求)

我偶然发现:https: //github.com/jaredhanson/passport-facebook/issues/26

&

https://github.com/drudge/passport-facebook-token

看起来与passport-facebook完全不同的策略.

在假设时我是否正确:

一个用fb JS SDK登录,然后facebook-token策略以某种方式从文档或正文对象中提取标记和fb id?

或者还有其他正确的方法来实现这一目标吗?我就是试图避免服务器SDK强制执行的重定向

Ora*_*nic 38

本周我花了几天的时间试图找出使用Facebook身份验证进行私有API的最佳方法,使用passport.js - passport-facebook-token非常适合这种情况.

假设这是两个独立的身份验证策略,您是正确的.您不需要安装passport-facebook来使用passport-facebook-token.

如果您在客户端JS(或iOS等)中实现了Facebook身份验证,并且正在寻找一种方法来使用您的用户的Facebook authToken对API请求进行身份验证,那么passport-facebook-token是一个非常优雅的解决方案.

passport-facebook-token的工作完全独立于passport-facebook,在将请求传递给您的控制器之前,基本上处理Facebook内部所需的重定向.

因此,要使用passport-facebook-token验证API路由,您需要设置这样的护照策略:

passport.use('facebook-token', new FacebookTokenStrategy({
    clientID        : "123-your-app-id",
    clientSecret    : "ssshhhhhhhhh"
  },
  function(accessToken, refreshToken, profile, done) {
    // console.log(profile);

    var user = {
        'email': profile.emails[0].value,
        'name' : profile.name.givenName + ' ' + profile.name.familyName,
        'id'   : profile.id,
        'token': accessToken
    }

    // You can perform any necessary actions with your user at this point,
    // e.g. internal verification against a users table,
    // creating new user entries, etc.

    return done(null, user); // the user object we just made gets passed to the route's controller as `req.user`
  }
));
Run Code Online (Sandbox Code Playgroud)

值得注意的是,User.findOrCreatepassport-facebook-token自述文件中使用的方法不是默认的mongo/mongoose方法,而是一个你必须安装的插件.

要将此身份验证策略用作任何路由的中间件,您需要将access_token对象作为URL参数或作为请求正文的属性传递给它.

app.get('/my/api/:access_token/endpoint', 
        passport.authenticate(['facebook-token','other-strategies']), 
        function (req, res) {

            if (req.user){
                //you're authenticated! return sensitive secret information here.
                res.send(200, {'secrets':['array','of','top','secret','information']});
            } else {
                // not authenticated. go away.
                res.send(401)
            }

        }
Run Code Online (Sandbox Code Playgroud)

NB.该access_token属性区分大小写并使用下划线.passport-facebook-token的文档并不广泛,但来源的评论非常好并且非常容易阅读,所以我建议你在那里看一看.这无疑帮助我了解护照工作的一些更一般的方式.