如何在Node.js / Angular中保护JWT令牌并刷新令牌

时间:2019-09-25 13:07:54

标签: node.js angularjs

我是Node js的新手。我正在构建一个简单的笔记记录应用程序,并希望使用JWT令牌进行身份验证并保护我的API。在研究中,我知道我需要创建两个令牌:

  1. 访问令牌(较短的到期时间,例如10分钟)
  2. 刷新令牌(过期时间最长为30天)

我的配置文件

class-2

中间件代码

"secret": "*************",
"refreshTokenSecret": "*************",
"port": 5000,
"tokenLife": 900,
"refreshTokenLife": 86400

这是回应

enter image description here

访问令牌可以保存在本地存储中。但文章称将刷新令牌另存为仅HTTP cookie。 我需要以下几点的答案(请记住,我只是一个初学者):

  1. 如何将刷新令牌存储为仅HTTP cookie(任何node-js代码) 示例会很有帮助)?
  2. 如何在客户端保护它,我是否应该将刷新令牌保存到数据库?
  3. 还有其他更好的解决方案来保护我的API吗?

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式使用仅HTTP的Cookie:

public authenticateUser(user: User, res: Response) {
        const authJwtToken = this.generateJWT({
            email: user.email,
            uuid: user.uuid
        });

        const cookieOptions = {
            maxAge: 3600000,
            secure: true,
            httpOnly: true
        };

        res.cookie('access_token', authJwtToken, cookieOptions);
    }
// you can then res.send({...}) or wtv

并不是没有什么可以阻止您存储多个cookie,所以我看不出为什么不以相同的方式存储两个cookie的原因。

现在是否将其存储在数据库中取决于要实现的目标。 通常,这不是必需的,但请注意,在这种情况下,服务器无法以任何方式使单个JWT无效。 (理论上,您可以更改签名密钥,但这会使所有密钥失效。)

如果要实现诸如“从所有设备注销”之类的功能,则需要将为每个用户发出的JWT存储在数据库中(最好是内存中的Redis或Redis)。并再次检查是否已使它们无效的额外信息-即使通常使用会话而不是JWT来实现这种功能

答案 1 :(得分:0)

请参阅此示例,我如何将我的 getByRefId API保护在nodjs中:

在路线文件中:

router.get("/refId/:refId", helper.auth, groupController.getByRefId);

helper.auth is   function  :

auth: (req, res, next) => {
    var token = req.body.token || req.headers['authorization'] || req.headers['Authorization'];

    if (token.startsWith('Bearer ')) {
        // Remove Bearer from string
        token = token.slice(7, token.length).trimLeft();
    }

    if (token) {
        jwt.verify(token, 'MY_SECRET', function (err, decoded) {
            if (err) {
                console.error('JWT Verification Error', err);
                return res.status(403).send(err);
            } else {
                req.payload = decoded;
                return next();
            }
        });
    } else {
        res.status(403).send('Token not provided');
    }
}

此使用 jwt = require('jsonwebtoken')库,您可以将其安装在nodejs项目中