从令牌创建Django会话

时间:2016-04-24 21:42:57

标签: angularjs django session nginx django-rest-framework

问题

我目前正在努力解决从Django提供身份验证强制媒体文件的众所周知的问题。问题的背景很简单:

  • 我们希望使用Django的媒体文件支持
  • 默认情况下,媒体文件不是私有的。事实上,通常网络服务器直接为他们服务。
  • 我们希望在访问媒体文件时对用户进行身份验证
  • 我们在前端使用令牌身份验证
  • 由于没有有效的会话,浏览器在访问私人文件时无法进行身份验证(例如在新标签中打开PDF)
  • 我们希望Django为浏览器提供身份验证,但需要以某种方式使用现有的身份验证令牌进行身份验证
  • 我们仍然希望nginx将文件发回,因此我们将在验证后利用X-Accel-Redirect

尝试解决

到目前为止我所做的(并且它有效)是创建另一个API视图,需要令牌身份验证并将文件发回,然后创建一个Angular指令以使用blob替换所有受保护的URL。当用户单击链接时,它使用令牌身份验证获取文件,然后创建包含该数据的Blob。然后浏览器打开那个blob。

不幸的是,无法共享blob,因此用户无法为这些文件粘贴彼此的链接。我想知道是否有办法绕过它。

目标

我的目标是使用令牌创建有效(和短期到期)会话。这样,当用户单击链接时,会发送请求以检查是否存在有效会话,然后以某种方式配置浏览器以便它可以使用该会话。整个过程将如下所示:

  • 用户点击链接(实际上是一个更复杂的角度指令)
  • Angular fires请求与服务器的会话
  • 服务器响应必要的信息
  • 使用JavaScript配置浏览器会话
  • 强制浏览器使用新建立的会话打开链接
  • 根据会话验证用户,使用标头将文件发送到nginx

我没有找到已实施的答案,我可以自己处理好的细节。我更感兴趣的是获得有关如何以最佳方式完成此操作的反馈。即:

  • 如何在API响应中给出一些会话信息来配置浏览器?
  • 我应该如何处理这些会话到期以使其安全
  • 我应该如何建立这个会话?每次点击链接时检查/创建会话是否合理(假设流量不是问题)
  • 这是一个合理的跨浏览器解决方案吗?还有更好的方法吗?
  • 如果文件URL与没有会话但拥有有效令牌的用户共享,我如何使用中间页面建立此会话?

部分选项

更新:我已与一些提出以下选项的同事交谈过:

  • 让API检索单个用途或短到期令牌,并将其作为查询参数附加到文件的URL,而不是会话。在请求中验证这一点。这有效,但仍然不允许共享URL。
  • 登录时建立会话。如果用户尝试访问文件时该会话已过期,则重定向到会话登录,然后在进行身份验证时重定向回文件。这也有效,但我想避免额外的身份验证步骤,因为令牌有很长的到期时间,会话有一个很短的时间。给予他们相同的到期也会有缺点,因为更频繁到期的令牌或者经常过期的会话并不理想。

2 个答案:

答案 0 :(得分:2)

您可以简单地将令牌放入cookie中。

这样,它将由浏览器自动发送到服务器,当用户直接访问可下载文件时,您可以将其用于身份验证。

不要读取Authorization:标题,而是告诉您的Django中间件从cookie中读取标记字符串。

答案 1 :(得分:0)

我想了解有关此主题的更多信息。

我也从django获得了令牌,但是每次刷新页面时,用户都会再次登录。我想将其保存在Cookie中,以使用户即使关闭浏览器也可以发出请求。

我也想通过csrf保护来保护它,但是我不知道该怎么做。 另外,将令牌作为纯文本包含在cookie中是否安全? 我对此过程有很多疑问。

我正在使用django作为后端API,并使用reactjs作为前端。

如何让django生成cookie和csrf cookie?

1)我希望能够使用令牌从浏览器到我的网站进行身份验证(

2)我也想将这个api用于移动应用程序吗?因此创建cookie,是否会在移动应用程序身份验证期间产生冲突?