在 Django 中处理两个源之间基于会话的身份验证

问题描述 投票:0回答:1

这可能会涉及“最佳实践”类型的问题,但我想解释我的方法,列出我的假设并获得建设性的反馈。

目前,我的设置由两台服务器组成;

  • Node.js
    localhost:3000
    和 a
  • 上运行 Sapper/Svelte 的前端服务器
  • Django(不是 DjangoRestFramework),后端运行于
    localhost:8000

我的 Django 会话正在使用

django.contrib.sessions.backends.cached_db
缓存到本地运行的 Redis 实例(并将数据转发到我的 Postgres 实例)。

我正在使用我在

Django 应用程序
中定义的
views
urls 处理我的用户模型。

构建认证时;我正在遵循该方法

  • 使用 Django 的
    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 authentication session
1个回答
0
投票

对于后代,使用 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] 可能不是全部,但如果还有更多,我一定会更新。

© www.soinside.com 2019 - 2024. All rights reserved.