使用 jwt 保护休息 api

Securing rest api with jwt

我一直在尝试通过身份验证来保护我的休息 api,因此只有受信任的应用程序才能使用此 api。我一直在寻找最佳实践和指南,但其中 none 实际上在实际示例中解释了这一点。

我创建了与此类似的 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 并将该信息包含在客户端的应用程序中,这有点像令牌,不需要从服务器请求新令牌。

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

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

一个更简洁的想法是将此令牌附加到 session object。如果您使用 Node.js 和 Express,那么您可以使用 express-session 库。这会将 session object 附加到每个请求。用户通过身份验证后,您可以将此令牌分配给 session object 并将其存储在数据库或内存存储中,例如 redis。对于额外的安全层,您可以为每个受信任的应用程序生成一个 api-key 并将其存储在您的数据库中。 api-key 可以作为 header.

传递

要使用 Express 设置 sessions,但我建议您阅读其他选项和方法来根据您的需要进行配置:

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. 使用令牌中的凭据(不要在此处输入用户密码),验证用户是否是您系统中的有效用户 - 假设他们已经在您的 website/platform 上注册了一个帐户。例如,您可以使用电子邮件地址或用于验证的内容存储权限级别和用户 ID。

希望对您有所帮助!包装您的头部身份验证实践需要一段时间。