Django OAuth - 在中间件中包含授权 Header?
Django OAuth - Include Authorization Header in Middleware?
我配置 django-oauth-toolkit 成功。我想在收到来自 OAuth 提供商的访问令牌后授权第三方用户。在 Django Admin 中保存后,我可以像这样使用它访问受限制的网站:
curl -H "Authorization: Bearer 123456" -X GET http://localhost:8000/secret/
我想象的架构是有一个登录页面,我可以在其中使用 Django 会话将授权令牌存储在 headers 中。但是,当我尝试在中间件中设置授权 header 时,它不允许我访问该站点。我在访问该站点时检查了响应,看起来我根本没有保存 headers。我尝试了下面的代码。
class OAuthDt:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
def process_request(request):
request.META['Authorization'] = "Bearer 123456"
return(request)
request.Authorization = "Bearer 123456"
request = process_request(request)
response = self.get_response(request)
return(response)
Views.py
@login_required()
def secret_page(request, *args, **kwargs):
return HttpResponse('Secret contents!', status=200)
所以我的猜测是:
- 在我看来,身份验证检查是在中间件保存 Header 之前完成的。
- 有些东西阻止我更新请求 header 或覆盖我的 header。也许另一个中间件
查看服务器日志后,我更倾向于2。
[18/May/2020 13:54:38] "GET /secret/ HTTP/1.1" 302 0
This executes before redirecting user
Not Found: /accounts/login/
[18/May/2020 13:54:38] "GET /accounts/login/?next=/secret/ HTTP/1.1" 404 2362
这是我的中间件的顺序:
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'DtTranslator.middleware.OAuthDt',
'oauth2_provider.middleware.OAuth2TokenMiddleware',
]
有什么建议吗?
好吧,在检查了 Oauth 中间件之后,我只需要正确修改 header。
request.META['HTTP_AUTHORIZATION'] = "Bearer 123456"
我配置 django-oauth-toolkit 成功。我想在收到来自 OAuth 提供商的访问令牌后授权第三方用户。在 Django Admin 中保存后,我可以像这样使用它访问受限制的网站:
curl -H "Authorization: Bearer 123456" -X GET http://localhost:8000/secret/
我想象的架构是有一个登录页面,我可以在其中使用 Django 会话将授权令牌存储在 headers 中。但是,当我尝试在中间件中设置授权 header 时,它不允许我访问该站点。我在访问该站点时检查了响应,看起来我根本没有保存 headers。我尝试了下面的代码。
class OAuthDt:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
def process_request(request):
request.META['Authorization'] = "Bearer 123456"
return(request)
request.Authorization = "Bearer 123456"
request = process_request(request)
response = self.get_response(request)
return(response)
Views.py
@login_required()
def secret_page(request, *args, **kwargs):
return HttpResponse('Secret contents!', status=200)
所以我的猜测是:
- 在我看来,身份验证检查是在中间件保存 Header 之前完成的。
- 有些东西阻止我更新请求 header 或覆盖我的 header。也许另一个中间件
查看服务器日志后,我更倾向于2。
[18/May/2020 13:54:38] "GET /secret/ HTTP/1.1" 302 0
This executes before redirecting user
Not Found: /accounts/login/
[18/May/2020 13:54:38] "GET /accounts/login/?next=/secret/ HTTP/1.1" 404 2362
这是我的中间件的顺序:
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'DtTranslator.middleware.OAuthDt',
'oauth2_provider.middleware.OAuth2TokenMiddleware',
]
有什么建议吗?
好吧,在检查了 Oauth 中间件之后,我只需要正确修改 header。
request.META['HTTP_AUTHORIZATION'] = "Bearer 123456"