gpt4 book ai didi

django - 使用带有 token 而不是 Cookie 的 Django session 框架?

转载 作者:行者123 更新时间:2023-12-02 11:36:46 30 4
gpt4 key购买 nike

我有一个带有 protected 端点的 DRF API,它根据用户有权访问的内容返回过滤后的数据。

我有一个单独的 Django OAuth2 提供程序,其中包含用户模型和确定用户有权访问的内容所需的值。

用户应该能够通过 DRF API 上的登录端点进行身份验证。 API 反过来代表用户从 Oauth2 提供程序获取 token ,并进行几次调用以获取允许用户访问的资源列表。

理想情况下,DRF API 将生成一个 token 并将其返回给用户。每当用户使用 token 发出后续请求(登录后)时,API 就能够通过调用 Oauth 提供程序返回的值来过滤结果。

问题是如何存储这些信息。这感觉类似于在匿名用户 session 中存储数据,但使用请求 header 而不是 cookie。我考虑过推出 django.contrib.sessions.middleware.SessionMiddleware 的定制版本,但我更喜欢使用既定的方法而不是编写自定义代码,因为这似乎不应该是一个独特的问题。

重申一下:是否可以创建匿名用户 session ,在其中存储信息,并通过请求 header 而不是 cookie 检索 session ?

最佳答案

这里是Django提供的原始SessionMiddleware.process_request。让我们快速浏览一下。

def process_request(self, request):
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
request.session = self.SessionStore(session_key)

我们可以清楚地看到,它使用设置中定义的 SESSION_COOKIE_NAME 属性从 cookie 中显式获取 session 标识符。因此,我们绝对必须创建自己的 SessionMiddleware 子类并定义我们自己的 process_request 行为。

无论传入的 token 是否经过身份验证,我们都需要从 header 中检索 token 值,并使用它来启动我们的 session 引擎。它可能是这样的:

from django.contrib.sessions.middleware import SessionMiddleware
from django.conf import settings

class CustomSessionMiddleware(SessionMiddleware):
def process_request(self, request):
session_key = request.META.get("HTTP_%s" % settings.SESSION_KEY_NAME, None)
request.session = self.SessionStore(session_key)

确保将 django 设置文件中的 SESSION_KEY_NAME 属性设置为将在其中发送此 token 的 header 键的名称。然后,将 django 的原始 SessionMiddleware 替换为自定义 session 中间件的路径,您的 requests.session 应该开始根据输入 token 为您提供数据。

注意:您可能还需要修改 process_response 行为,因为您可能不需要发回 Set-Cookie header 。

关于django - 使用带有 token 而不是 Cookie 的 Django session 框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34817238/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com