在不使用客户端的情况下在 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/
有没有办法在服务器而不是客户端设置 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/