在不使用客户端的情况下在 Django 中设置授权 Header

Setting an Authorization Header in Django without the use of a client

有没有办法在服务器而不是客户端设置 header? 可能的一个例子是我试图设置一个授权 Header 与服务器的令牌而不是来自客户端,因为客户端无法访问该令牌,因为它是使用 httponly cookie 制作的。

在 Django 视图中尝试了一些东西。

request.META['HTTP_AUTHORIZATION'] = f'Token {....}'

它的工作原理是我可以在 header 中看到该键和值,但由于某些原因它似乎不起作用,因为它应该像使用客户端一样,这个逻辑将发出请求一个经过身份验证的,但是从服务器执行此操作似乎并没有这样做..

通过向我展示 header 中的 object,这就像在欺骗我相信它有效,但它没有任何功能。

编辑 view.py

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def createView(request, *args, **kwargs):
     token = request.COOKIES.get('token')
     request.META['HTTP_AUTHORIZATION']=f'Token {token}'
     print(request.users)
     print(request.headers)
     #to see what's coming through
     serializer = TweetPostSerializer(data=request.data)
     if serializer.is_valid():
          serializer.save(user=request.user)
          return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_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)

要了解为什么需要这样做:https://docs.djangoproject.com/en/3.1/topics/http/middleware/