处理 Node.js 和 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()
    locahost:8000/login or signup
    authenticate
    运行
    login
    POST 来创建会话。
    然后我将 
  • User.*
  • session_key
    返回到前端,然后前端将这些内容发送到可能需要身份验证的任何请求的正文中。
    在后端,我使用请求正文中发送给我的电子邮件将 
  • email
  • session_key
    进行匹配,以检查会话是否有效。
    
    
  • 现在,由于我一直使用 Django 模板,因此我不必维护单独的会话实例,也不必考虑共享会话。我觉得这种方法可能更Python-ic。

在这个阶段,我还完成了所有模型、迁移,这种方法有效,但似乎不是最好的方法。

希望得到反馈/批评。

python node.js django authentication session
1个回答
0
投票
对于后代,使用 Django 的

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

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