首页 > 解决方案 > 存储和使用 JWT 和密钥

问题描述

我的应用程序有一个登录路径。我jwt tokens用来保护路线,但我很难完全理解secret key.

我认为我需要使用密钥来验证jwt。每当用户登录时,我都会向用户发送JWT Token和发送Secret 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"}

标签: node.jsrestapi

解决方案


永远不要将您的密钥提供给其他任何人。您需要将此密钥保密。您可以使用密钥来签署和颁发令牌。它也可用于验证令牌,但使用您的密钥来验证令牌通常不是一个好主意,因为您随后需要将密钥发送到验证令牌的服务,这与我前两句话中的建议背道而驰.

如果您的密钥是非对称签名的,您可以基于秘密(私有)密钥以所谓的 JSON Web 密钥的形式生成一个公共密钥(在此处阅读有关 JWK 的信息)。然后可以将该公钥提供给宇宙中的任何人,并且该公钥只能用于验证 JWT;公钥不能用于签署新令牌。

这意味着您应该只将密钥存储在一个位置,并且应该在您签署和发布令牌的身份验证服务器上。在此处阅读有关非对称密钥签名的更多信息


推荐阅读