我有我的应用程序的登录路线。我使用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"}
答案 0 :(得分:1)
您绝不要将密钥发送回客户端。您必须将密钥存储在服务器中。您需要它来签名和验证jwt令牌。
这应该是流程:
在https://jwt.io/上了解有关JWT的更多信息
答案 1 :(得分:1)
您绝不能将您的秘密密钥提供给任何人。您需要将此密钥保密。您可以使用密钥来签名和发行令牌。它也可以用于验证令牌,但是使用您的秘密密钥来验证令牌通常是一个坏主意,因为您随后需要将秘密密钥发送到正在验证令牌的服务,这违反了我前两句话的建议。 。
如果您的秘密密钥是非对称签名的,则可以基于所谓的JSON Web密钥(read about JWKs here)形式的秘密(私有)密钥生成公共密钥。然后可以将该公共密钥提供给Universe中的任何人,并且该公共密钥只能用于验证JWT。公钥不能用于签名新令牌。
这意味着您应该只将密钥存储在一个位置,并且该密钥应该在用于签名和颁发令牌的身份验证服务器上。了解有关非对称密钥签名here
的更多信息