存储和使用JWT和密钥

时间:2019-02-25 16:20:45

标签: node.js rest api

我有我的应用程序的登录路线。我使用jwt tokens保护路由,但是我很难理解secret key的完整用法。

我要使用密钥验证jwt。每当用户登录时,我都会向用户发送JWT TokenSecret keyJWT存储在本地存储(电话或应用存储)

我应该如何处理密钥?我是否都应该存储到本地和数据库?

登录路线

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"}

2 个答案:

答案 0 :(得分:1)

您绝不要将密钥发送回客户端。您必须将密钥存储在服务器中。您需要它来签名和验证jwt令牌。

这应该是流程:

  • 用户登录
  • 服务器生成JWT(使用密钥)并将其(仅jwt)发送给客户端
  • 客户端将JWT保存在本地存储中或所需的位置,并在需要进行经过身份验证的http调用时将其作为标头发送到服务器。
  • 当服务器收到经过身份验证的呼叫时,他必须验证JWT(使用用于登录的相同密码)以对呼叫进行身份验证。

https://jwt.io/上了解有关JWT的更多信息

答案 1 :(得分:1)

您绝不能将您的秘密密钥提供给任何人。您需要将此密钥保密。您可以使用密钥来签名和发行令牌。它也可以用于验证令牌,但是使用您的秘密密钥来验证令牌通常是一个坏主意,因为您随后需要将秘密密钥发送到正在验证令牌的服务,这违反了我前两句话的建议。 。

如果您的秘密密钥是非对称签名的,则可以基于所谓的JSON Web密钥(read about JWKs here)形式的秘密(私有)密钥生成公共密钥。然后可以将该公共密钥提供给Universe中的任何人,并且该公共密钥只能用于验证JWT。公钥不能用于签名新令牌。

这意味着您应该只将密钥存储在一个位置,并且该密钥应该在用于签名和颁发令牌的身份验证服务器上。了解有关非对称密钥签名here

的更多信息