繁体   English   中英

使用JWT保护Rest API

[英]Securing rest api with jwt

我一直在尝试通过身份验证来保护我的其余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,并将该信息包含在客户端应用程序中,其工作方式类似于令牌,而无需从服务器请求新令牌。

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

使用JWT非常好,实际上我是自己使用它的。 但是在示例中使用它的方式并不十分安全。 JWT不加密,而只是编码。 如果您将此令牌发送给某人并包含敏感信息(例如superSecret ,则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. } if(!user.session){ // Route to login page. }
  3. 检查if(!user.session.token){ // Not authorized. } if(!user.session.token){ // Not authorized. }
  4. 验证user.session.token
  5. 使用令牌中的凭据(不要在此处输入用户密码),请确认该用户是您系统中的有效用户-假设他们已在您的网站/平台上注册了一个帐户。 例如,您可以使用电子邮件地址或用于验证的内容存储权限级别和用户ID。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM