【问题标题】:Setting an Authorization Header in Django without the use of a client在不使用客户端的情况下在 Django 中设置授权标头
【发布时间】:2020-12-30 08:18:08
【问题描述】:

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

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

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

它的工作原理是我可以在标头中看到该键和值,但由于某些原因,它似乎不起作用,因为它应该像使用客户端一样,这个逻辑将使请求成为经过身份验证的请求,但是做来自服务器的 this 似乎没有这样做..

通过向我显示标题中的对象来欺骗我相信它可以工作,但它没有任何功能。

编辑 视图.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)

【问题讨论】:

  • 你能分享一下你的观点和curl吗
  • 我没有使用 curl,因为我已经有一个 Js 前端。我也会分享这个观点
  • 您能分享更多详细信息,例如视图和网址吗?
  • 我已经编辑了带有视图的帖子..而且我正在使用带有令牌的 n httponly cookie,它在那里工作正常.. 只是在服务器上设置了标题之后的那一行代码,它似乎没有像设置标题那样起作用,即使它正确地向我显示标题,它只是不像请求应该被验证那样起作用。就好像它正在设置授权标头但没有执行它的功能

标签: django authentication http-headers authorization


【解决方案1】:

您需要在中间件中执行此操作,并将其放入 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/

【讨论】:

  • 嘿,谢谢你,你的救命稻草!但是包括一个问题,我不能让这个中间件只为一个视图工作,就像 mixins 的工作方式一样。因为它似乎适用于所有视图,因此我将无法在首先是因为该视图也需要获得授权才能执行此操作。那么是否有可能确保它适用于我的观点而不是所有观点
  • @HarrisonAustinOsagiede 我添加了对令牌的检查。然后,如果 cookie 存在,这将只设置 auth 标头,并且对于任何其他请求都是一个 noop。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2019-07-01
  • 2017-08-31
相关资源
最近更新 更多