Passport JWT&授权与验证

时间:2015-10-05 04:51:55

标签: passport.js mean-stack jwt

Passport似乎是简单身份验证的一个很好的选择,不引人注目且不难设置。我正在构建一个使用JWT进行身份验证的MEAN堆栈,因此我查看了Passport JWT。然而,有一些我感到困惑的事情。

1)假设Passport JWT仅用于验证请求,而不是用于生成有效的jwt,我是否正确?也就是说,它是否应仅用于验证令牌的存在?

2)passport.authorizepassport.authenticate之间的区别是什么?我何时应该使用另一个?

3)我有3条路线用于身份验证相关事宜,loginsignupauthenticate

login将检查用户电子邮件/密码组合是否存在并匹配,然后为客户端生成令牌。 signup将检查以确保电子邮件尚未存在,然后为客户端生成令牌。 现在authenticate这是我混淆了的地方。如果我已经authenticatelogin,我是否还需要signup路线?如果有的话,似乎身份验证将是我为JWT策略传递到passport.use的功能,然后loginsignup可能会添加verify_token路由是我唯一没有保护的路线,其他所有路线都可以拨打passport.authenticatepassport.authorize

1 个答案:

答案 0 :(得分:7)

  1. 正确。 Passport JWT(passport-jwt)仅用于验证请求。您需要另一个工具来实际生成令牌。 This tutorial使用JWT Simple(jwt-simple),我使用jsonwebtoken(每this reference)。
  2. 我还没有看到passport.authorize的任何引用,所以我相信passport.authenticate是您正在寻找的内容。您将在路由中使用passport.authenticate来验证传入请求是否具有JWT令牌并且是允许的。
  3. 由于您通过loginsignup生成令牌,authenticate是多余且不必要的。只需确保在路由中使用passport.authenticate来验证请求期间的访问权限。
  4. 这里要记住的一般设置步骤是:

    • passport-jwt用于身份验证
    • 您需要另一个工具来创建JWT令牌
    • 您生成并返回到生成请求的任何内容的JWT令牌需要在后续请求的标题("Authorization: JWT eyJ0eXAiO...")中出现
    • you need to setup your JWT strategy and tell passport to use it
    • 使用passport.authenticate通过标头中的JWT令牌验证对传入请求的访问权限,例如:

    
    
    router.post('/users', passport.authenticate('jwt', {session: false}), function(req, res) {
      // do something...
    });