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