您需要使用包jsonwebtoken。express-jwt
当您使用 ExpressJS 框架时,该包可帮助您保护部分 API。
秘密很像密码。_ 它对有效负载进行编码,以便敏感信息可以在 JWT 中传递而不会被操纵。它可以确定身份验证机制没有被更改,因此服务器可以信任该用户。
注意:在某些情况下,您会看到 JWT 使用 RS256 算法进行编码。这将需要提供一个公钥/私钥对来验证和解码 JWT。
产生
该sign()
函数在jsonwebtoken
. 如果您使用jwt-simple包,您将使用encode()
.
您可以使用任何密钥签署 JWT,但您必须使用相同的密钥才能使用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。为了验证 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
令牌中的 是已注册的声明,表示“发行于”。
现在让我们参考您的示例(我省略了函数并替换了秘密):
var expressJWT = require('express-jwt');
// Assume app = express();
app.get('/protected',
expressJWT({
secret: 'superSecretSquirrel'
}),
...
);
/protected
如果您有一个使用秘密“superSecretSquirrel”签名的 JSON Web 令牌,那么它只允许访问该路径。如果您有一个带有不匹配密钥的令牌,您会得到一个UnauthorizedError
,并且您会想要抛出一个 HTTP 401。