【问题标题】:Nodejs authorization approachesNodejs 授权方式
【发布时间】:2019-04-17 22:34:21
【问题描述】:

在我不得不说之前我发现了一些与这个问题相关但没有完全回答的帖子。

所以我用 mongoDB 实现了一个 nodejs REST API 服务器,DB,但是关于身份验证我理解这个想法,使用 jwt 令牌它可以完美地工作。

/api/login

您会收到带有令牌的响应。现在您可以使用此令牌请求资源 例如。

api/posts/:user_id

获取您所有的帖子...没问题!用 mongoose findBy.. bla bla 查询!

所以在这种情况下授权很容易,检查查询参数 user_id 是否等于令牌(使用 user_id 解析令牌)。繁荣资源是安全的。

但如果我有一些资源未被 user_id 引用,保护这些资源的最佳做法是什么?!

示例

api/settings/:settings_id/emails

假设我知道其他用户的 setting_id,并且我使用令牌进行了身份验证。那么服务器如何知道我不允许使用此资源?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

首先,您首先应该采取更多措施来保护令牌。当您在用户登录后发出令牌时,如果强制执行 https,则应将其令牌存储在 sessionStrorage 之类的 Web 存储中,或者使用 httpOnly cookie(除了 user_id 之外,您还可以在签名时添加 user-agent/geoip 指纹此令牌添加了额外的安全层)。然后,当用户请求受保护资源时,您可以将签名令牌的指纹和 user_id 与他们代表请求的用户匹配。

您可以使用passport-jwt 之类的东西作为 express 中的中间件来要求对路由进行身份验证。在护照中,您定义了一个提取器处理程序,该处理程序基本上告诉它在哪里查看用户是否有令牌,如果有,它会验证它添加req.user 属性,您可以在后续请求中使用该属性来确定用户的 user_id令牌持有者。所以基本上使用这种方法,您知道每个请求的 user_id,这可以让您将其与他们请求的用户信息进行比较。

app.post('/settings/:settings_id/emails', passport.authenticate('jwt', { session: false }),
    function(req, res) {
        res.send(req.user.id);
    }
);

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 2019-02-26
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2018-11-05
    • 2015-01-21
    • 2022-08-24
    • 2019-10-31
    相关资源
    最近更新 更多