在Django中设置授权标头而不使用客户端

在Django中设置授权标头而不使用客户端,django,authentication,http-headers,authorization,Django,Authentication,Http Headers,Authorization,有没有一种方法可以在服务器中而不是从客户端设置头? 可能的一个例子是,我试图将带有令牌的授权头设置到服务器,而不是从客户端设置,因为客户端无法访问该令牌,因为它是使用httponly cookie创建的 试着用Django的眼光看问题 request.META['HTTP_AUTHORIZATION'] = f'Token {....}' 它的工作原理是,我可以在报头中看到密钥和值,但由于某些原因,它似乎不起作用,因为它应该像使用客户端一样。这种逻辑将使请求成为经过身份验证的请求,但从服务器执

有没有一种方法可以在服务器中而不是从客户端设置头? 可能的一个例子是,我试图将带有令牌的授权头设置到服务器,而不是从客户端设置,因为客户端无法访问该令牌,因为它是使用httponly cookie创建的

试着用Django的眼光看问题

request.META['HTTP_AUTHORIZATION'] = f'Token {....}'
它的工作原理是,我可以在报头中看到密钥和值,但由于某些原因,它似乎不起作用,因为它应该像使用客户端一样。这种逻辑将使请求成为经过身份验证的请求,但从服务器执行此操作似乎不能做到这一点

这就像是在欺骗我,让我相信它可以通过在标题中显示对象来工作,但是它没有任何功能

编辑 view.py


您需要在中间件中执行此操作,并在AuthenticationMiddleware之前将其放入settings.py中的中间件列表中:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'myproject.myapps.myapp.middleware.MyAuthorizationMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
其中
myproject.myapps.myapp.middleware.MyAuthorizationMiddleware

class MyAuthorizationMiddleware:
    def __init__(self, get_response=None):
        self.get_response = get_response

    def __call__(self, request):
        token = request.COOKIES.get('token')
        if token:
            request.META['HTTP_AUTHORIZATION']=f'Token {token}'
        return self.get_response(request)

要理解为什么需要这样做:

您需要在中间件中执行此操作,并将其放入settings.py中的中间件列表中,在AuthenticationMiddleware之前:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'myproject.myapps.myapp.middleware.MyAuthorizationMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
其中
myproject.myapps.myapp.middleware.MyAuthorizationMiddleware

class MyAuthorizationMiddleware:
    def __init__(self, get_response=None):
        self.get_response = get_response

    def __call__(self, request):
        token = request.COOKIES.get('token')
        if token:
            request.META['HTTP_AUTHORIZATION']=f'Token {token}'
        return self.get_response(request)

要理解为什么需要这样做:

您可以分享您的视图和curl吗?我没有使用curl,因为我已经有了一个Js前端。我也会分享这个视图,你能分享更多的细节吗,比如视图和URL?我已经用视图编辑了这篇文章。。而且我正在使用一个带有令牌的httponly cookie,它在那里工作得很好。。只是在用这行代码在服务器上设置了头之后,它似乎没有像它应该设置头那样工作,即使它正确地显示了头,它也没有像应该对请求进行身份验证那样工作。这就好像它正在设置授权头,但没有执行它的功能。您可以共享您的视图和curl我没有使用curl,因为我已经有了一个Js前端。我也会分享这个视图,你能分享更多的细节吗,比如视图和URL?我已经用视图编辑了这篇文章。。而且我正在使用一个带有令牌的httponly cookie,它在那里工作得很好。。只是在用这行代码在服务器上设置了头之后,它似乎没有像它应该设置头那样工作,即使它正确地显示了头,它也没有像应该对请求进行身份验证那样工作。这就好像它正在设置授权头,但没有执行它的功能嘿,谢谢你,你是个救命恩人!。但是有一个问题,我不能让这个中间件只在一个视图中工作,比如mixin的工作方式。。因为它似乎适用于所有视图,因此我首先无法创建令牌/cookie,因为该视图也需要授权才能这样做。那么,是否有可能确保它适用于我的观点,而不是所有的观点views@HarrisonAustinOsagiede我已为令牌添加了一张支票。这将只在cookie存在的情况下设置auth头,并且将成为任何其他请求的noop。谢谢它工作得很好嘿,谢谢你,你是个救命恩人!。但是有一个问题,我不能让这个中间件只在一个视图中工作,比如mixin的工作方式。。因为它似乎适用于所有视图,因此我首先无法创建令牌/cookie,因为该视图也需要授权才能这样做。那么,是否有可能确保它适用于我的观点,而不是所有的观点views@HarrisonAustinOsagiede我已为令牌添加了一张支票。这将只在cookie存在的情况下设置auth头,并且将成为任何其他请求的noop。谢谢,它工作得很好