如何处理在Django中不共享同一域的前端

时间:2014-11-30 18:20:10

标签: django session cookies django-rest-framework

我在Django项目中遇到了一个很大的问题。

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

当我使用Django提供的会话框架时,如何处理这种情况?似乎SESSION_COOKIE_DOMAIN仅允许在一个子域上设置会话Cookie。结果是,如果我希望能够以.my-domain.org(即SESSION_COOKIE_DOMAIN = None)登录,那么当它调用API端点时,我无法从.front-end.com收到会话cookie。另一方面,将SESSION_COOKIE_DOMAIN设置为.front-end.com会阻止我连接到网站管理员。情况也受SESSION_COOKIE_PATH影响......

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

1 个答案:

答案 0 :(得分: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