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