expressJS 应用程序中的身份验证
Authentication in expressJS app
我想在 expressJS 应用中使用 JWT 实现身份验证。
在谷歌搜索一些网站后,我了解了 JWT 概念,但我无法使用 expressJS 实现 JWT。
我没有在 expressJS 中得到 JWT 的任何确切示例。
我已阅读 express-jwt 节点模块的自述文件,但我的问题是如何生成 JWT 以及如何验证每个请求收到的 JWT。
到 :
的确切过程是什么
- 生成 JWT
- 解码 JWT
- 验证智威汤逊
此外,以下示例中的 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);
});
您需要使用包 jsonwebtoken。当您使用 ExpressJS 框架时,express-jwt
包可以帮助您保护 API 的某些部分。
秘密很像密码。它对有效负载进行编码,以便敏感信息可以在 JWT 中传递而不被操纵。它确定身份验证机制未被更改,因此服务器可以信任该用户。
注意:在某些情况下,您会看到使用 RS256 算法编码的 JWT。这将需要提供 public/private 密钥对来验证和解码 JWT。
生成
sign()
函数在 jsonwebtoken
中执行此操作。如果您使用 jwt-simple 包,您将使用 encode()
。
您可以使用任何密钥签署 JWT,但您必须使用相同的密钥才能使用 verify()
。
假设您有以下 JSON 对象要创建 JWT:
var json = { user: 'jdoe',
firstName: 'John',
lastName: 'Doe',
id: 1
};
var token = jwt.sign(json, 'superSecretSquirrel');
您的 signed/encoded 令牌现在看起来像:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiamRvZSIsImZpcnN0TmFtZSI6IkpvaG4iLCJsYXN0TmFtZSI6IkRvZSIsImlkIjoxLCJpYXQiOjE0MzI3NjU3NzJ9.4mowMfRKIENnAKtRdDkj-BZZqAS8_b0eS3nj5qvEu9Q
您可以在 jwt.io 验证这一点(确保您提供此处给出的秘密)。
验证和解码
verify()
函数异步执行此操作。回调中的对象 it returns 是解码后的 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
是一个 registered claim,表示 'Issued At'。
现在让我们参考你的例子(我省略了函数并替换了秘密):
var expressJWT = require('express-jwt');
// Assume app = express();
app.get('/protected',
expressJWT({
secret: 'superSecretSquirrel'
}),
...
);
如果您有 JSON 使用秘密 'superSecretSquirrel' 签名的 Web 令牌,则此操作仅允许访问路径 /protected
。如果您有一个带有不匹配秘密的令牌,您将得到一个 UnauthorizedError
,并且您会想要抛出一个 HTTP 401。
我想在 expressJS 应用中使用 JWT 实现身份验证。
在谷歌搜索一些网站后,我了解了 JWT 概念,但我无法使用 expressJS 实现 JWT。
我没有在 expressJS 中得到 JWT 的任何确切示例。
我已阅读 express-jwt 节点模块的自述文件,但我的问题是如何生成 JWT 以及如何验证每个请求收到的 JWT。
到 :
- 生成 JWT
- 解码 JWT
- 验证智威汤逊
此外,以下示例中的 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); });
您需要使用包 jsonwebtoken。当您使用 ExpressJS 框架时,express-jwt
包可以帮助您保护 API 的某些部分。
秘密很像密码。它对有效负载进行编码,以便敏感信息可以在 JWT 中传递而不被操纵。它确定身份验证机制未被更改,因此服务器可以信任该用户。
注意:在某些情况下,您会看到使用 RS256 算法编码的 JWT。这将需要提供 public/private 密钥对来验证和解码 JWT。
生成
sign()
函数在 jsonwebtoken
中执行此操作。如果您使用 jwt-simple 包,您将使用 encode()
。
您可以使用任何密钥签署 JWT,但您必须使用相同的密钥才能使用 verify()
。
假设您有以下 JSON 对象要创建 JWT:
var json = { user: 'jdoe',
firstName: 'John',
lastName: 'Doe',
id: 1
};
var token = jwt.sign(json, 'superSecretSquirrel');
您的 signed/encoded 令牌现在看起来像:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiamRvZSIsImZpcnN0TmFtZSI6IkpvaG4iLCJsYXN0TmFtZSI6IkRvZSIsImlkIjoxLCJpYXQiOjE0MzI3NjU3NzJ9.4mowMfRKIENnAKtRdDkj-BZZqAS8_b0eS3nj5qvEu9Q
您可以在 jwt.io 验证这一点(确保您提供此处给出的秘密)。
验证和解码
verify()
函数异步执行此操作。回调中的对象 it returns 是解码后的 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
是一个 registered claim,表示 'Issued At'。
现在让我们参考你的例子(我省略了函数并替换了秘密):
var expressJWT = require('express-jwt');
// Assume app = express();
app.get('/protected',
expressJWT({
secret: 'superSecretSquirrel'
}),
...
);
如果您有 JSON 使用秘密 'superSecretSquirrel' 签名的 Web 令牌,则此操作仅允许访问路径 /protected
。如果您有一个带有不匹配秘密的令牌,您将得到一个 UnauthorizedError
,并且您会想要抛出一个 HTTP 401。