使用jwt保护rest api

时间:2016-10-12 10:46:56

标签: node.js rest api token

我一直在尝试使用身份验证来保护我的其他API,因此只有受信任的应用才能使用此API。我一直在寻找最佳实践和指南,但在现实世界的例子中,它们都没有真正解释过。

我创建了与此类似的jsonwebtoken身份验证:

if(!user){
    res.json({success:false, message: 'auth failed, user not found'});
} else {
    var token = jwt.sign(user, app.get('superSecret'), {
        expiresIn: 1440 //24 hours
    });
    res.json({
        success: true,
        message: 'token generated',
        token: token
    });
}

这样可行,返回一个令牌然后我可以将所有请求传递给api,但是如何让应用程序找到该令牌并使用它而不是每次api调用手动传递令牌?

我已经看到,在大多数情况下,您可以在应用程序中生成特殊的api-key,并在客户端的应用程序中包含该信息,其工作类似于令牌,并且无需从服务器请求新令牌。

这是如何工作的,或者如何为我的宁静服务创建受信任的应用程序密钥?

1 个答案:

答案 0 :(得分:0)

使用JWT非常好,事实上我自己使用它。但是你在你的例子中使用它的方式并不是很安全。 JWT没有加密,而只是编码。如果您将此令牌发送给某人并包含superSecret等敏感信息,则任何有权访问该令牌的人都可以对此进行解码。

更清晰的想法是将此令牌附加到会话对象。如果您正在使用Node.js和Express,那么您可以使用express-session库。这会将会话对象附加到每个请求。用户通过身份验证后,您可以将此令牌分配给会话对象,并将其存储在数据库或内存存储中,例如redis。要获得额外的安全层,您可以为每个受信任的应用生成api-key并将其存储在数据库中。 api-key可以作为标题传递。

要使用Express设置会话,但我建议您阅读其他选项以及根据您的需求进行配置的方法:

var session = require("express-session");
app.use(session({
        secret: /* Your secret. */,
        store: /* Your redis store object. */,
        client: /* Your redis client object. */,
        resave: false,
        saveUninitialized: false
}));

要在登录时将access-token附加到用户(例如):

router.post("/login", function(request, response){

    /* Do all user validation here */

    request.session.token = jwt.sign({
            /* User info to store in session. */
    }, "superSecret");

    return response.redirect( /* Dashboard */ );

});

您对用户进行身份验证的方式是:

  1. 验证api-key是否有效。
  2. 检查if(!user.session){ // Route to login page. }
  3. 检查if(!user.session.token){ // Not authorized. }
  4. 验证user.session.token
  5. 使用令牌内的凭据(不要将用户密码放在此处),验证用户是否是系统中的有效用户 - 假设他们已在您的网站/平台上注册了帐户。例如,您可以使用电子邮件地址或用于验证的内容存储权限级别和userIds。
  6. 我希望这有帮助!包装头部认证实践需要一段时间。

相关问题