【问题标题】:Authentication in expressJS appexpressJS 应用程序中的身份验证
【发布时间】:2015-07-03 23:14:45
【问题描述】:

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

  1. 生成 JWT
  2. 解码 JWT
  3. 验证智威汤逊

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

【问题讨论】:

  • express-jwt 只解码/验证令牌,生成留给像jsonwebtoken 这样的包。秘密应该与生成令牌的秘密相匹配。

标签: node.js express express-jwt


【解决方案1】:

您需要使用包jsonwebtoken。当您使用 ExpressJS 框架时,express-jwt 包可帮助您保护部分 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 }

令牌中的iatregistered claim,意思是“发行于”。

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

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

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

如果您有一个使用秘密“superSecretSquirrel”签名的 JSON Web 令牌,则仅允许访问路径 /protected。如果您的令牌的密钥不匹配,您将获得 UnauthorizedError,并且您需要抛出 HTTP 401。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2016-10-25
    • 2020-06-16
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多