Passportjs Facebook 登录流程(passport-facebook vs passport-token)

Posted

技术标签:

【中文标题】Passportjs Facebook 登录流程(passport-facebook vs passport-token)【英文标题】:Passportjs Facebook login flow (passport-facebook vs passport-token) 【发布时间】:2016-05-06 01:11:00 【问题描述】:

使用 Node、Express 和 Passport。

好的,我和我的团队正在为双面市场类型的应用程序构建一个 REST API。我们已经为电子邮件和密码登录设置了基本的 LocalStrategy。

我们希望 API 用户代理不可知,因此我们可以通过 Web、Android 或 iOS 使用 API。

但我们感到困惑的是 FB 登录流程。问题是,Passportjs 的幕后究竟发生了什么。我们已经研究了“passport-facebook”和“passport-facebook-token”策略,但无法真正决定使用哪一个。

这是我目前对流程的理解:

如果这是正确的,我最好让客户端从 FB 获取 access_token 然后将其发送给我,还是让 FB 通过重定向和回调 URL 处理它?

护照令牌:

passport.use('facebook-token', new FacebookTokenStrategy( 
    clientID: 'xxx',
    clientSecret: 'xxx'
, function(accessToken, refreshToken, profile, done) 
    // asynchronous
    //console.log("into passport auth");
    process.nextTick(function() 
        User.findOne('facebook.id': profile.id, function(error, user) 
            console.log("user is " + JSON.stringify(user));
            console.log("profile is " + JSON.stringify(profile));

            //do user creation stuff etc.

            return done(error, user);
        );
    );
));

authRouter.post('/facebook', passport.authenticate('facebook-token'), function (req, res) 
    console.log("into controller");
    if (req.user)
        //log the user in since they successfully authenticated with facebook.
        req.login(user);
        res.status(200).end();
     else 
        res.status(401).end();
    
);

护照脸书:

passport.use('facebook', new FacebookStrategy( 
    callbackURL: "http://75.128.65.176:8080/auth/facebook/callback",
    clientID: 'xxx',
    clientSecret: 'xxx'
, function(accessToken, refreshToken, profile, done) 
    // asynchronous
    //console.log("into passport auth");
    process.nextTick(function() 
        User.findOne('facebook.id': profile.id, function(error, user) 
            console.log("user is " + JSON.stringify(user));
            console.log("profile is " + JSON.stringify(profile));

            //do user creation stuff etc.

            return done(error, user);
        );
    );
));

// Redirect the user to Facebook for authentication.  When complete,
// Facebook will redirect the user back to the application at
//     /auth/facebook/callback
authRouter.get('/facebook', passport.authenticate('facebook'));

// Facebook will redirect the user to this URL after approval.  Finish the
// authentication process by attempting to obtain an access token.  If
// access was granted, the user will be logged in.  Otherwise,
// authentication has failed.
authRouter.get('/facebook/callback',
    passport.authenticate('facebook',  successRedirect: '/',
                                  failureRedirect: '/login' ));

非常感谢任何有关此流程实际工作方式的详细信息/详细说明!

【问题讨论】:

我发现这些示例非常有用github.com/philipbrack/express-passport-facebook-token-example(服务器)和github.com/philipbrack/…(客户端) 【参考方案1】:

验证显示的 2 个流程是否正确。

是的,他们是正确的。


问:我有一个 API 列表。我如何用护照-facebook 策略保护他们

您有多种选择:

1. 验证Facebook token

服务器返回Facebook token以及用户信息 客户端每次调用 API 时都会发送Facebook token 服务器验证Facebook token

有关如何验证 Facebook token here 的更多信息。

2. 使用 JSON Web Token (JWT)

服务器在获取 Facebook 用户信息后返回 JWT 客户端每次调用 API 时都会发送 JWT 服务器验证JWT

这样,服务器不必向 Facebook 发送请求来验证Facebook token。更多信息here。


问:如果我使用的是 passport-facebook-token,我如何告诉用户去 facebook 上登录

您的/api/auth/facebook 只接受Facebook token 并返回相应的HTTP code。因此,要求用户去 Facebook 登录是客户的工作。

有关如何手动创建 Facebook 登录的更多信息here。

【讨论】:

【参考方案2】:

在使用原生 iosandroid Facebook SDK 时,客户端 Facebook 重定向很不方便 - 因为它们有时会重定向到用户安装的 Facebook 应用程序。因此,如果您想要一个真正通用的 API,那么您应该使用 passport-facebook-token

【讨论】:

以上是关于Passportjs Facebook 登录流程(passport-facebook vs passport-token)的主要内容,如果未能解决你的问题,请参考以下文章

passportJS - passport-facebook 无法获取失败重定向路由

使用 PassportJS 和 Connect for NodeJS 来验证 Facebook 用户

使用 passport.js、sails.js API 和 ember.js 登录 Facebook

Facebook第三方登录流程总结

如果用户通过一次身份验证,防止用户再次登录passportjs?

用Facebook登录流程