2015-04-25 50 views
1

我想在expressJS应用中使用JWT实现验证。
我在Google搜索了一些网站后学到了JWT概念,但我无法使用expressJS实现JWT。
我在expressJS中没有得到JWT的确切示例。
我已阅读read-me note的express-jwt节点模块,但我的问题是如何生成JWT以及如何验证每个请求接收的JWT。
什么是确切的过程:在expressJS应用中验证

  1. 生成JWT
  2. 解码JWT
  3. 验证JWT

    此外,什么是秘密在下面的示例中的意思是:
var jwt = require('express-jwt'); 

app.get('/protected', 
    jwt({ 
     secret: 'shhhhhhared-secret' 
    }), 
    function(req, res) { 
     if (!req.user.admin) return res.send(401); 
     res.send(200); 
    }); 
+0

'express-jwt'只解码/验证令牌,生成是留给像['jsonwebtoken'](https://github.com/auth0/node-jsonwebtoken)这样的软件包。这个秘密应该与令牌生成的秘密相匹配。 – robertklep

回答

0

您需要使用软件包jsonwebtoken。当你使用ExpressJS框架时,express-jwt包可以帮助你保护你的API的一部分。

秘密很多一个密码。它对有效载荷进行编码,以便敏感信息可以在JWT中传递而不被操纵。它可以确保认证机制没有被改变,因此服务器可以信任该用户。

注:在某些情况下,您会看到JWT采用RS256算法编码。这将要求提供公钥/私钥对来验证和解码智威汤逊。

生成

sign()函数做这jsonwebtoken。如果您使用jwt-simple包,则将使用encode()

您可以用任何秘密签署智威汤逊,但您必须使用同一个秘密才能使用verify()

假设你有,你想使一个JWT以下JSON对象:

var json = { user: 'jdoe', 
    firstName: 'John', 
    lastName: 'Doe', 
    id: 1 
}; 

var token = jwt.sign(json, 'superSecretSquirrel'); 

你签署/编码的令牌会是这个样子:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiamRvZSIsImZpcnN0TmFtZSI6IkpvaG4iLCJsYXN0TmFtZSI6IkRvZSIsImlkIjoxLCJpYXQiOjE0MzI3NjU3NzJ9.4mowMfRKIENnAKtRdDkj-BZZqAS8_b0eS3nj5qvEu9Q 

您可以在jwt.io验证这一点(确保你提供这里给出的秘密)。

验证和解码

verify()功能做到这一点异步。它在回调中返回的对象是已解码的JWT。为了验证智威汤逊,您需要将秘密传递给该功能。

假设“superSecretSquirrel”的秘密如上图所示:

var jwt = require('jsonwebtoken'); 

jwt.verify(token, 'superSecretSquirrel', function (err, decoded) { 
    if (err) 
     console.error(err); 

    // Show the decoded JWT 
    console.log(decoded); 
}); 

解码的令牌将显示为:

{ user: 'jdoe', firstName: 'John', lastName: 'Doe', id: 1, iat: 1432765772 } 

凡在令牌中的iat是指“分在一个registered claim ”。

现在让我们来参考您的例子(我离开了功能和更换的秘密):

var expressJWT = require('express-jwt'); 
// Assume app = express(); 

app.get('/protected', 
    expressJWT({ 
     secret: 'superSecretSquirrel' 
    }), 
    ... 
); 

这样做是只允许访问路径/protected如果您有签了JSON网络令牌与秘密'superSecretSquirrel'。如果你有一个令牌的秘密不匹配,你会得到一个UnauthorizedError,你会想扔一个HTTP 401.