混合护照-facebook和护照-jwt的最佳方法是啥?

Posted

技术标签:

【中文标题】混合护照-facebook和护照-jwt的最佳方法是啥?【英文标题】:What's the best way to mix passport-facebook and passport-jwt?混合护照-facebook和护照-jwt的最佳方法是什么? 【发布时间】:2016-08-14 20:51:31 【问题描述】:

我是 Node.js 开发的新手,目前在空闲时间从事一个宠物项目。

到目前为止,我已经使用 passport 和 passport-jwt 为该策略创建了 JWT 身份验证,并且我在所有 RESTful API 中都使用了它。

现在我正在考虑将其与某种 Facebook 身份验证混合使用,但仍想坚持使用令牌身份验证。

目前这是我生成和获取令牌的方式:

exports.authenticate = function(req, res) 
    User.findOne(
        email: req.body.email
    , function(err, user) 
        if (err)
            return res.status(400).send(getErrorMessage(err));

        if (!user) 
            res.status(400).send(
                success: false,
                message: 'Authentication failed. User not found.'
            );
         else 
            if (user.checkPassword(req.body.password)) 

                let token = jwt.encode(user, config.secretPhrase);

                res.json(
                    success: true,
                    token: 'JWT ' + token
                );
             else 
                res.status(401).send(
                    success: false,
                    message: 'Authentication failed. Wrong password.'
                );
            
        
    );
;

app.route('/api/users/authenticate')
        .post(user.authenticate);

为了验证我执行以下操作:

let user = require('../../app/controllers/user-controller');
app.route('/api/todos')
        .get(user.validateLogin, todos.list)
        .post(user.validateLogin, todos.create);

用户控制器:

exports.validateLogin = passport.authenticate('jwt', 
    session: false
);

任何人都可以提出一个巧妙的方法来混合这两种策略?我应该使用express-jwt 吗? express-jwt 和 passport-jwt 有什么区别?

【问题讨论】:

【参考方案1】:

您可以像使用 passport-jwt 一样使用 passport-facebook 和新策略,这样您就可以将 Facebook 用户令牌保存在数据库中并返回您的令牌

【讨论】:

这是最常用的方法。您可以为身份验证实施多种护照策略,并在成功时返回您的 jwt。将是一个新的身份验证路由,如果用户已经有一个帐户并使用 fb 登录,则在 DB 中查找电子邮件,如果存在则向您的用户发送 jwt。【参考方案2】:

看起来您当前正在将令牌发回给最终用户。您如何保存客户端?我建议使用像 jsonwebtoken 这样的简单 JWT 库,并将令牌设置为 httpOnly cookie。如果您当前将其保存在 localStorage 中,您可能更容易受到 XSS 攻击。 以下是我当前如何处理设置和检查用户 JWT 的要点: https://gist.github.com/briancw/8c2021817c3bd34972e8e8deb6048a4f

【讨论】:

以上是关于混合护照-facebook和护照-jwt的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用护照 jwt 进行身份验证

Passport & JWT & Google/Facebook 策略 - 如何结合 JWT 和 Google/Facebook 策略?

护照验证 jwt 没有响应

护照-facebook-token vs 护照-facebook

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

Sails.js 中的 JWT 和护照