这可能会涉及“最佳实践”类型的问题,但我想解释我的方法,列出我的假设并获得建设性的反馈。
目前,我的设置由两台服务器组成;
localhost:3000
和 alocalhost:8000
。我的 Django 会话正在使用
django.contrib.sessions.backends.cached_db
缓存到本地运行的 Redis 实例(并将数据转发到我的 Postgres 实例)。
我正在使用我在
Django 应用程序中定义的
views
和 urls
处理我的用户模型。
构建认证时;我正在遵循该方法
fetch()
、Request
和 locahost:8000/login or signup
运行 authenticate
POST login
到 User.*
创建会话。session_key
和 email
返回到前端,然后前端将这些内容发送到可能需要身份验证的任何请求的正文中。session_key
正文中发送给我的电子邮件将 user_id
与 Request
进行匹配,以检查 Session
是否有效。现在,由于我一直使用 Django 的模板,因此我不必维护单独的
Session
实例,也不必考虑共享 Session
。我觉得这种方法可能更Python-ic。
在这个阶段,我还完成了所有模型、迁移,这种方法有效,但似乎不是最好的方法。
希望得到反馈/批评。
对于后代,使用 Django 的
Session
在两个源之间进行授权。
背景:Django 默认使用
Session
授权。当客户端获得身份验证时,Django 会为客户端创建一个Session
,并使用此Session
来跟踪客户端和服务器之间的状态。
在身份验证期间,客户端向服务器发出
HTTPRequest
,如果经过身份验证,Django会为客户端创建一个Session
,为此Session
生成一个唯一的会话ID,创建一个HTTPResponse
,将此会话 ID 存储在 HTTPResponse.cookies
中,将 Session
存储在数据库 [1] 中,并将 HTTPResponse
发送到客户端。
当
HTTPResponse
被序列化时,HTTPResponse.cookies
被序列化为以下格式:[2]
Set-Cookie: key=value
Set-Cookie: key=value
•••
并与
HttpResponse.headers
中的其他值一起成为 HTTP 响应标头的一部分。
客户端应正确处理这些标头,尤其是
Set-Cookie
标头。请参阅MDN。
如果要通过不同来源发送或接收 cookie,在 Javascript 中,Web API 的
fetch()
函数要求将 credentials
选项设置为 "include"
:
fetch(url, { credentials: "include" })
并且在 Django 中,
SESSION_COOKIE_DOMAIN
必须设置为正确的原点。
在我忘记之前,跨源请求安全性。这正是我所忘记的。 [3]
[1] 默认情况下,Django 将
Session
存储在您的数据库中,但 Django 可以配置为将 Session
存储在您的 文件系统 [django-docs] 或您的 缓存中。 [django-docs]
[2]
HTTPResponse.cookies
实际上是 Python 原生的 http.cookies.SimpleCookie
[python-docs] 并且它们的序列化格式是它们实际的 __str__
表示形式。
[3] 可能不是全部,但如果还有更多,我一定会更新。