django - 如何处理Django中不共享同一个域的前端

标签 django session cookies django-rest-framework

我在 Django 项目中的 session 面临一个大问题。

后端托管在.my-domain.org前端在.front-end.com处使用后端的REST API .将来,可能会出现完全不同域上的其他前端。

使用django提供的session框架时出现这种情况如何处理?好像SESSION_COOKIE_DOMAIN只允许在 上设置 session cookie一 子域。结果是,如果我想能够登录.my-domain.org (即, SESSION_COOKIE_DOMAIN = None )然后我无法从 .front-end.com 接收 session cookie当它调用 API 端点时。另一方面,设置 SESSION_COOKIE_DOMAIN.front-end.com会阻止我连接到站点管理员。情况也受到SESSION_COOKIE_PATH的影响当然...

任何帮助都非常受欢迎。我很确定我不是第一个需要可以从外部域访问具有 session 身份验证的 REST API 的人。

最佳答案

Django 使用 cookie 进行基于 session 的身份验证,通常不能跨多个域设置这些 cookie。虽然您可以使用 CORS and withCredentials 稍微解决这个问题,这可能是 blocked by default在某些浏览器中。

跨域工作时,通常最好使用另一种身份验证方法。即使您能够让 CORS 与 cookie 一起工作,您也将不得不与 CSRF across domains 战斗。 , Django REST Framework 指出 in their documentation .我会推荐 OAuth 2 因为广泛的客户端支持和 Django REST 框架中的支持,但其他人已经使用 TokenAuthentication without issues .

使用 OAuth 时,您需要将前端设置为客户端并使用 web authentication flow用于身份验证,否则您是 leaving private keys out in the open ,结局并不好。这将以类似于“单点登录”的方式工作,但不需要您的前端签署请求并保存私钥。你也不需要担心 CSRF,因为 Django REST Framework 只需要它用于 SessionAuthentication .

关于django - 如何处理Django中不共享同一个域的前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216556/

相关文章:

php - 如何设置 session 的生命周期

python - 有没有一种简单的方法可以让 flask 中的 session 超时?

security - 使用 FireSheep 劫持 Facebook;什么是最好的预防措施,它是如何起作用的?

asp.net-mvc-4 - 注销后如何使http session 无效

django - Django中不访问数据库能否获取相关对象的ID

python - 使用 python Django 和 Mysql。由于Binlog,数据不会插入MySQL

django - 何时使用 Haystack/ElasticSearch 与 Django 的 ORM

python - 提交后django清除表单字段

database - 保持数据库连接打开是否昂贵?

java - 更新 cookie 的 maxage 以使其在 Struts 2 中过期