【问题标题】:Authorize resource (eg. image) access through a field in mongodb vs authorization token?通过 mongodb vs 授权令牌中的字段授权资源(例如图像)访问?
【发布时间】:2020-01-03 06:28:50
【问题描述】:

我有一个关于私有资源访问的问题。

我正在设计一个应用程序,每个用户都可以在其个人空间中上传文件(例如图像、视频、pdf 等)。因此,当我收到对某个资源的请求时,我需要检查发送该请求的用户是否应该可以访问某个文件。

我打算允许访问的方式如下:-

  1. 浏览器发送请求,例如,用户的私有图像以及用户的 jwt(用户登录时创建的访问令牌)。
  2. 如果请求未附带 jwt,则服务器发送 401 响应。
  3. 但是,如果请求附带 jwt,则从 jwt 中检索用户名。
  4. 此外,请求的 url 包含文件 id,此 id 用于检索与资源(在本例中为图像)对应的 mongo doc。
  5. Mongo 文档包含一个字段 -accessibleTo: ["user_name1", "user_name2", ...]。
  6. 在 mongodb 中针对此数组 (accessibleTo) 检查尝试访问文件的用户的用户名。
  7. 如果数组中存在用户名,则将资源(在本例中为图像)发送到浏览器,如果不存在,则服务器发送 401 响应。

我的问题是,我已经阅读了必须通过令牌允许授权的地方,但是,一个简单的数据库检查似乎对我的应用程序很好。我错过了什么吗?你能解释一下这个实现的缺点吗?

谢谢!

【问题讨论】:

    标签: mongodb security oauth authorization


    【解决方案1】:

    首先,您尝试的方式没问题。

    这里有一些场景,

    • usernameunique 在您的收藏中吗?如果不是这样 那么你应该存储accessibleTo: ["user_id1", "user_id2", ...] 同时你应该在 jwt 中包含你的user_id 负载。

    • 如果用户可以根据您的设计访问资源,您将如何将资源发送到浏览器?如果资源存储在某处并且您正在发送该资源的直接 url,那么下次用户可以直接访问该资源而无需访问您的端点。因此,如果您需要对此进行控制,则需要在存储服务器资源链接中添加某种授权。这是在 aws s3 上的操作方法 - https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html

    【讨论】:

      【解决方案2】:

      您描述的设计包括通过会话令牌的基于令牌的身份验证:

      连同用户的 jwt 访问令牌(在用户登录时创建)

      然后您可以使用它来检查服务器端的访问权限。

      这提供了图像安全性,假设您有足够短的会话到期时间。与其他方法相比,使用会话有利有弊,但从安全角度来看,图像是sufficiently good。请注意,the same article 中提到的缺点之一是使用会话通常会将您的网站暴露给CSRF,但如果您确实打算使用会话,则此缺点不是特定于图像的。

      【讨论】:

        猜你喜欢
        • 2017-06-27
        • 2018-06-13
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        • 2014-06-30
        相关资源
        最近更新 更多