我在 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/