我目前正在争夺从Django的服务认证强制媒体文件的众所周知的问题。这个问题的背景很简单:
- 我们要使用Django的媒体文件支持
- 媒体文件默认情况下不私。事实上,通常情况下,网络服务器直接提供服务。
- 我们要进行身份验证的用户访问
- 我们正在使用的前端令牌认证
- 由于没有有效的会话,浏览器无法访问私人文件(如打开时的身份验证的媒体文件时,在新标签页PDF)
- 我们希望Django的为浏览器提供认证,但需要使用现有的身份验证令牌以某种方式进行身份验证
- 我们仍然希望nginx的发送文件回来,所以我们将充分利用认证后
X-Accel-Redirect
。
试图解决
我到目前为止已经完成(和它的作品)是创建需要令牌认证和文件发送回另一个API视图,然后创建了一个角指令换出所有受保护的URL都有一个blob。当用户点击链接时,它使用令牌认证获取文件,然后创建一个包含该数据的blob。浏览器然后打开该blob。
不幸的是,blob无法共享,所以用户无法为这些文件粘贴链接。我想知道是否有解决办法。
目标
我的目标是使用令牌创建有效的(短期满)会议。这样,当用户点击一个链接时,会发送一个请求来检查是否有有效的会话,然后以某种方式配置浏览器,以便它可以使用该会话。整个过程看起来就像这样:
- 用户点击链接(这实际上是一个比较复杂的角度指令)
- 会话角火灾请求服务器
- 服务器提供必要的信息响应
- 使用JavaScript配置浏览器会话
- 强制浏览器打开新建会话的链接
- 根据会话验证用户,使用标头将文件发送到nginx
我不是在寻找一个实现的答案,我可以自己处理好细节。我更感兴趣的是获得有关如何以最佳方式完成这一任务的反馈。即:
- 如何在API响应中给出一些会话信息来配置浏览器?
- 我应该如何处理这些会话过期以确保安全
- 我应该如何建立此会话?每次点击链接时检查/创建会话是否合理(假设流量在这里没有问题)
- 这是一个合理的跨浏览器解决方案吗?有更好的方法吗?
- 当文件URL与没有会话但拥有有效令牌的用户共享时,如何使用中间页面建立此会话?
一些选项
更新:我已经与已经提出了下列选项的一些同事说:
- 而不是一个会话,使API检索单个使用或短期过期令牌并将其附加到文件的URL作为查询参数。在请求中验证它。这有效,但仍然不允许分享这些网址。
- 登录时建立会话。如果该会话在用户尝试访问文件时过期,则重定向到会话登录名,然后在通过身份验证时重定向回文件。这也适用,但我想避免额外的身份验证步骤,因为令牌有很长的到期时间,会话有一个短的。给他们同样的失效也会有弊端,因为更经常失效的代币或不经常失效的代码并不理想。
你的最终目标是什么?在用户之间共享文件?用户在访问文件之前是否应该登录?共享链接/文件的规则/条件是什么?用户是否可以共享每个文件?谁可以访问哪些文件以及如何为每个文件设置权限? – WayBehind
用户必须先登录才能查看文件。他们通常会事先登录,否则将被重定向到登录。所有用户都可以看到所有文件。目标是进行身份验证,同时仍允许用户将链接粘贴到其他用户。身份验证非常简单(如问题中所述)。问题在于验证并仍然允许共享。 –
如果用户必须先登录才能看到这些文件,那么在访问该文件之前,哪些因素会阻止您验证每个用户?还有一点我不清楚的是,“验证,同时仍允许用户将链接粘贴到其他用户” 。验证什么?用户?用户已经登录了吗? “粘贴其他用户的链接”是什么?粘贴在哪里?出于什么目的?是不是每个用户访问文件需要登录? – WayBehind