使用Django Session Framework与令牌而不是Cookie?

Fin*_*gel 6 authentication django session oauth django-rest-framework

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

我有一个单独的Django OAuth2提供程序,它包含用户模型和确定用户有权访问权限所需的值.

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

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

问题是如何存储这些信息.这类似于在匿名用户会话中存储数据,但使用请求标头而不是cookie.我已经考虑过滚动自定义版本的django.contrib.sessions.middleware.SessionMiddleware,但我更喜欢使用已建立的方法而不是编写自定义代码,因为这似乎不应该是一个独特的问题.

重申:是否可以创建匿名用户会话,存储信息,并通过请求标头而不是cookie检索会话?

ari*_*eet 4

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

def process_request(self, request):
    session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
    request.session = self.SessionStore(session_key)
Run Code Online (Sandbox Code Playgroud)

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

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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