node.js - 存储和使用 JWT 和密钥
问题描述
我的应用程序有一个登录路径。我jwt tokens
用来保护路线,但我很难完全理解secret key
.
我认为我需要使用密钥来验证jwt
。每当用户登录时,我都会向用户发送JWT Token
和发送Secret key
。JWT
存储在本地存储(手机或应用程序存储)中
我应该如何处理密钥?我应该同时存储到本地和数据库吗?
登录路径
api.post('/api/login', (req, res) => {
var secretKey;
require('crypto').randomBytes(48, function(err, buffer) {
secretKey = buffer.toString('hex');
//Create JWT and Secret Key
jwt.sign({user}, secretKey, {expiresIn: '30s'}, (err, token) => {
res.json({
access_token : token,
secret_key : secretKey
});
});
});
});
登录后响应
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6ImV4YW1wbGV1c2VyIiwiZW1haWwiOiJleGFtcGxlQGdtYWlsLmNvbSJ9LCJpYXQiOjE1NTExMTE1ODAsImV4cCI6MTU1MTExMTYxMH0.aSTVC-HcEdrH1KBNtuD_MoLZ8DWnSiM6bCqO4EgJ5zM",
"secret_key": "2e6a98abb5b23339ad14601d3bedc1d23847498cb18daf8cfc98c2a2095ec8f47d80053f6d4e22b8f6419407ac3083dc"}
解决方案
永远不要将您的密钥提供给其他任何人。您需要将此密钥保密。您可以使用密钥来签署和颁发令牌。它也可用于验证令牌,但使用您的密钥来验证令牌通常不是一个好主意,因为您随后需要将密钥发送到验证令牌的服务,这与我前两句话中的建议背道而驰.
如果您的密钥是非对称签名的,您可以基于秘密(私有)密钥以所谓的 JSON Web 密钥的形式生成一个公共密钥(在此处阅读有关 JWK 的信息)。然后可以将该公钥提供给宇宙中的任何人,并且该公钥只能用于验证 JWT;公钥不能用于签署新令牌。
这意味着您应该只将密钥存储在一个位置,并且应该在您签署和发布令牌的身份验证服务器上。在此处阅读有关非对称密钥签名的更多信息
推荐阅读
- html - 如何使角度组件可重用?(角度 2+)
- r - 将字符向量转换为具有字符向量名称的空列表
- python - 覆盖自定义类异常
- c# - 数据集中的多个系列
- flutter - 我们可以在 Flutter 中构建图像编辑器吗?
- python - 使用 matplotlib 从各种表创建子图
- android - 随机提问,不重复
- python - 通过串行通信自动执行登录操作
- .net-core-3.0 - 我不能在 net core 3 startap 中使用 ContractResolver
- swift - NSCocoaErrorDomain Code=257 文件无法打开,因为您无权查看它:FileManager attributesOfItem 在 iOS13 中返回 nil