Skip to content

Commit 41aa49e

Browse files
dulmandakhauvipy
authored andcommitted
new style middleware
1 parent 37640ee commit 41aa49e

File tree

5 files changed

+27
-18
lines changed

5 files changed

+27
-18
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ David Smith
3939
Tom Evans
4040
Dylan Giesler
4141
Spencer Carroll
42+
Dulmandakh Sukhbaatar

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1616

1717
## [unreleased]
1818

19+
## [1.4.1]
20+
21+
### Changed
22+
* #925 OAuth2TokenMiddleware converted to new style middleware, and no longer extends MiddlewareMixin.
23+
1924
## [1.4.0] 2021-02-08
2025

2126
### Added

oauth2_provider/middleware.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
from django.contrib.auth import authenticate
22
from django.utils.cache import patch_vary_headers
3-
from django.utils.deprecation import MiddlewareMixin
43

54

6-
class OAuth2TokenMiddleware(MiddlewareMixin):
5+
class OAuth2TokenMiddleware:
76
"""
87
Middleware for OAuth2 user authentication
98
@@ -22,15 +21,17 @@ class OAuth2TokenMiddleware(MiddlewareMixin):
2221
It also adds "Authorization" to the "Vary" header, so that django's cache middleware or a
2322
reverse proxy can create proper cache keys.
2423
"""
24+
def __init__(self, get_response):
25+
self.get_response = get_response
2526

26-
def process_request(self, request):
27+
def __call__(self, request):
2728
# do something only if request contains a Bearer token
2829
if request.META.get("HTTP_AUTHORIZATION", "").startswith("Bearer"):
2930
if not hasattr(request, "user") or request.user.is_anonymous:
3031
user = authenticate(request=request)
3132
if user:
3233
request.user = request._cached_user = user
3334

34-
def process_response(self, request, response):
35+
response = self.get_response(request)
3536
patch_vary_headers(response, ("Authorization",))
3637
return response

tests/test_auth_backends.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,20 @@ def setUp(self):
8686
super().setUp()
8787
self.anon_user = AnonymousUser()
8888

89-
def dummy_get_response(request):
90-
return None
89+
def dummy_get_response(self, request):
90+
return HttpResponse()
9191

9292
def test_middleware_wrong_headers(self):
9393
m = OAuth2TokenMiddleware(self.dummy_get_response)
9494
request = self.factory.get("/a-resource")
95-
self.assertIsNone(m.process_request(request))
95+
m(request)
96+
self.assertFalse(hasattr(request, "user"))
9697
auth_headers = {
9798
"HTTP_AUTHORIZATION": "Beerer " + "badstring", # a Beer token for you!
9899
}
99100
request = self.factory.get("/a-resource", **auth_headers)
100-
self.assertIsNone(m.process_request(request))
101+
m(request)
102+
self.assertFalse(hasattr(request, "user"))
101103

102104
def test_middleware_user_is_set(self):
103105
m = OAuth2TokenMiddleware(self.dummy_get_response)
@@ -106,17 +108,19 @@ def test_middleware_user_is_set(self):
106108
}
107109
request = self.factory.get("/a-resource", **auth_headers)
108110
request.user = self.user
109-
self.assertIsNone(m.process_request(request))
111+
m(request)
112+
self.assertIs(request.user, self.user)
110113
request.user = self.anon_user
111-
self.assertIsNone(m.process_request(request))
114+
m(request)
115+
self.assertEqual(request.user.pk, self.user.pk)
112116

113117
def test_middleware_success(self):
114118
m = OAuth2TokenMiddleware(self.dummy_get_response)
115119
auth_headers = {
116120
"HTTP_AUTHORIZATION": "Bearer " + "tokstr",
117121
}
118122
request = self.factory.get("/a-resource", **auth_headers)
119-
m.process_request(request)
123+
m(request)
120124
self.assertEqual(request.user, self.user)
121125

122126
def test_middleware_response(self):
@@ -125,17 +129,15 @@ def test_middleware_response(self):
125129
"HTTP_AUTHORIZATION": "Bearer " + "tokstr",
126130
}
127131
request = self.factory.get("/a-resource", **auth_headers)
128-
response = HttpResponse()
129-
processed = m.process_response(request, response)
130-
self.assertIs(response, processed)
132+
response = m(request)
133+
self.assertIsInstance(response, HttpResponse)
131134

132135
def test_middleware_response_header(self):
133136
m = OAuth2TokenMiddleware(self.dummy_get_response)
134137
auth_headers = {
135138
"HTTP_AUTHORIZATION": "Bearer " + "tokstr",
136139
}
137140
request = self.factory.get("/a-resource", **auth_headers)
138-
response = HttpResponse()
139-
m.process_response(request, response)
141+
response = m(request)
140142
self.assertIn("Vary", response)
141143
self.assertIn("Authorization", response["Vary"])

tox.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ envlist =
44
docs,
55
py{36,37,38,39}-dj{31,30,22},
66
py35-dj{22},
7-
py{36,37,38,39}-djmaster,
7+
py{38,39}-djmaster,
88

99
[gh-actions]
1010
python =
@@ -42,7 +42,7 @@ deps =
4242
passenv =
4343
PYTEST_ADDOPTS
4444

45-
[testenv:py{36,37,38,39}-djmaster]
45+
[testenv:py{38,39}-djmaster]
4646
ignore_errors = true
4747
ignore_outcome = true
4848

0 commit comments

Comments
 (0)