我在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才能从外部域访问的人。
答案 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
。