You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中验证Auth0 JWT时,如何从请求头获取用户名而非写死

解决从请求头动态获取JWT用户名的问题

要把硬编码的authuser改成从请求头动态获取用户名,你需要让JWT的用户名处理函数能访问到当前的请求对象,这里有两种可行的方案,你可以根据自己的代码结构选择:

方案一:利用线程本地存储(Thread Local)+ 中间件

这种方案可以在不改动原有JWT认证核心逻辑的前提下,让你的jwt_get_username_from_payload_handler函数拿到请求对象:

1. 创建请求中间件

在你的Django应用中新建middleware.py文件,添加以下代码来把当前请求存入线程本地存储:

import threading
_local = threading.local()

class RequestMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 把当前请求绑定到线程本地
        _local.request = request
        response = self.get_response(request)
        # 请求处理完成后清理,避免内存泄漏
        del _local.request
        return response

2. 注册中间件

在settings.py的MIDDLEWARE列表中添加这个中间件(建议放在靠前的位置):

MIDDLEWARE = [
    # 其他中间件...
    'your_app_name.middleware.RequestMiddleware',
]

3. 修改用户名处理函数

更新settings.py中的jwt_get_username_from_payload_handler,从请求头中提取用户名(这里假设你的请求头字段是X-Username,可以根据实际情况修改):

def jwt_get_username_from_payload_handler(payload):
    from your_app_name.middleware import _local
    # 获取当前请求对象
    request = _local.request
    # 从请求头提取用户名
    username = request.headers.get('X-Username')
    
    # 可选:添加校验,避免空用户名导致错误
    if not username:
        raise ValueError("请求头中缺少X-Username字段")
    
    return username

JWT_AUTH = {
    'JWT_PAYLOAD_GET_USERNAME_HANDLER': jwt_get_username_from_payload_handler,
    'JWT_PUBLIC_KEY': PUBLIC_KEY,
    'JWT_ALGORITHM': 'RS256',
    'JWT_AUDIENCE': API_IDENTIFIER,
    'JWT_ISSUER': JWT_ISSUER,
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
}

方案二:自定义JWT认证类

如果你希望更直接地控制认证流程,可以自定义JWT认证类,在认证过程中直接从请求头获取用户名:

1. 自定义认证类

在应用中新建authentication.py文件,添加以下代码:

from rest_framework_jwt.authentication import JSONWebTokenAuthentication

class CustomJWTAuthentication(JSONWebTokenAuthentication):
    def authenticate(self, request):
        # 先调用父类方法完成JWT令牌的验证
        auth_result = super().authenticate(request)
        if not auth_result:
            return None
        
        user, token = auth_result
        # 从请求头获取用户名(替换成你实际的请求头字段)
        username = request.headers.get('X-Username')
        
        if username:
            # 这里可以根据需求更新用户的用户名,或者创建新用户(如果需要)
            user.username = username
            user.save()
        
        return user, token

2. 配置默认认证类

在settings.py的REST_FRAMEWORK配置中替换默认的JWT认证类:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'your_app_name.authentication.CustomJWTAuthentication',
        # 其他认证类(如果需要)...
    ],
}

注意事项

  • 请根据你的实际业务场景替换请求头字段名(比如X-Username);
  • 建议添加必要的校验逻辑,避免请求头缺失用户名导致认证失败;
  • 如果你的用户模型有特殊的用户名规则,记得在获取后做相应的格式校验。

内容的提问来源于stack exchange,提问作者Shyamala Gopalakrishnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:30