在expressJS app中进行身份验证

时间:2015-04-25 08:34:57

标签: node.js express express-jwt

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

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

    此外,以下示例中的秘密是什么意思:
  4. 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);
        });
    

1 个答案:

答案 0 :(得分:0)

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

秘密非常像密码。它对有效负载进行编码,以便敏感信息可以在JWT中传递而无需进行操作。它确保了身份验证机制没有被更改,因此服务器可以信任该用户。

注意:在某些情况下,您会看到使用RS256算法编码的JWT。这将要求提供公钥/私钥对来验证和解码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 }

令牌中的iatregistered claim,表示'已发布'。

现在让我们参考你的例子(我省略了函数并替换了秘密):

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

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

如果您拥有使用秘密'superSecretSquirrel'签名的JSON Web令牌,则此操作仅允许访问路径/protected。如果您的密码不匹配,您将获得UnauthorizedError,并且您将要抛出HTTP 401。