如何处理 Django 中不共享同一个域的前端
Posted
技术标签:
【中文标题】如何处理 Django 中不共享同一个域的前端【英文标题】:How to deal with a front-end that does not share the same domain in Django 【发布时间】:2015-01-28 18:14:03 【问题描述】:我在 Django 项目中的会话遇到了一个大问题。
后端托管在.my-domain.org
,前端使用.front-end.com
后端的REST API。未来可能会出现完全不同域的其他前端。
我在使用Django提供的会话框架时如何处理这种情况? SESSION_COOKIE_DOMAIN
似乎只允许在 one 子域上设置会话 cookie。结果是,如果我希望能够在.my-domain.org
(即SESSION_COOKIE_DOMAIN = None
)登录,那么当它调用API 端点时,我无法从.front-end.com
接收回会话cookie。另一方面,将SESSION_COOKIE_DOMAIN
设置为.front-end.com
会阻止我连接到站点管理员。这种情况当然也受到SESSION_COOKIE_PATH
的影响...
我们非常欢迎任何帮助。我很确定我不是第一个需要带有会话身份验证的 REST API 才能从外部域访问的人。
【问题讨论】:
我对此没有简短的回答,但您要解决的问题可能是在“单点登录”(或“SSO”)领域......这些可能帮助***.com/q/4662348/202168code.google.com/p/django-sso 你有使用会话框架吗?你会遇到 CORS/JSONP 的挑战,你真的要介绍 CSRF 的挑战吗?如果可能,我建议您查看 OAuth 2 或TokenAuthentication
。
【参考方案1】:
Django 使用 cookie 进行基于会话的身份验证,这些通常不能跨多个域设置。虽然您可以使用CORS and withCredentials
稍微解决这个问题,但在某些浏览器中可能是blocked by default。
在跨域工作时,通常最好使用另一种身份验证方法。即使您能够让 CORS 与 cookie 一起使用,您也必须与 CSRF across domains 进行斗争,Django REST Framework 指出 in their documentation。我会推荐 OAuth 2,因为它有广泛的客户端支持和 Django REST Framework 中的支持,但其他人使用了TokenAuthentication
without issues。
使用 OAuth 时,您需要将前端设置为客户端,并使用web authentication flow 进行身份验证,否则您将是leaving private keys out in the open,结果不好。这将以类似于“单点登录”的方式工作,但不需要您的前端签署请求并持有私钥。你也不需要为 CSRF 操心,因为 Django REST Framework 只需要 SessionAuthentication
。
【讨论】:
我确实在考虑转向 OAuth2,因为它似乎是迄今为止我所读到的最明智的选择。以上是关于如何处理 Django 中不共享同一个域的前端的主要内容,如果未能解决你的问题,请参考以下文章