Skip to content

Commit 83367ff

Browse files
committed
Merge branch 'basicauth_valunarability' of https://github.com/hirokiky/django-oauth-toolkit into hirokiky-basicauth_valunarability
Conflicts: AUTHORS
2 parents c205297 + 4990742 commit 83367ff

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ Emanuele Palazzetti
1212
David Fischer
1313
Ash Christopher
1414
Rodney Richardson
15+
Hiroki Kiyohara

oauth2_provider/oauth2_validators.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import unicode_literals
22

33
import base64
4+
import binascii
45
import logging
56
from datetime import timedelta
67

@@ -35,7 +36,11 @@ def _extract_basic_auth(self, request):
3536
if not auth:
3637
return None
3738

38-
auth_type, auth_string = auth.split(' ')
39+
splitted = auth.split(' ', 1)
40+
if len(splitted) != 2:
41+
return None
42+
auth_type, auth_string = splitted
43+
3944
if auth_type != "Basic":
4045
return None
4146

@@ -54,7 +59,20 @@ def _authenticate_basic_auth(self, request):
5459

5560
encoding = request.encoding or 'utf-8'
5661

57-
auth_string_decoded = base64.b64decode(auth_string).decode(encoding)
62+
try:
63+
b64_decoded = base64.b64decode(auth_string)
64+
except (TypeError, binascii.Error):
65+
log.debug("Failed basic auth: %s can't be decoded as base64", auth_string)
66+
return False
67+
68+
try:
69+
auth_string_decoded = b64_decoded.decode(encoding)
70+
except UnicodeDecodeError:
71+
log.debug("Failed basic auth: %s can't be decoded as unicode by %s",
72+
auth_string,
73+
encoding)
74+
return False
75+
5876
client_id, client_secret = map(unquote_plus, auth_string_decoded.split(':', 1))
5977

6078
if self._load_application(client_id, request) is None:

oauth2_provider/tests/test_oauth2_validators.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,40 @@ def test_extract_basic_auth(self):
4242
self.assertIsNone(self.validator._extract_basic_auth(self.request))
4343
self.request.headers = {'HTTP_AUTHORIZATION': 'Dummy 123456'}
4444
self.assertIsNone(self.validator._extract_basic_auth(self.request))
45+
self.request.headers = {'HTTP_AUTHORIZATION': 'Basic'}
46+
self.assertIsNone(self.validator._extract_basic_auth(self.request))
47+
self.request.headers = {'HTTP_AUTHORIZATION': 'Basic 123456 789'}
48+
self.assertEqual(self.validator._extract_basic_auth(self.request), '123456 789')
49+
50+
def test_authenticate_basic_auth(self):
51+
self.request.encoding = 'utf-8'
52+
# client_id:client_secret
53+
self.request.headers = {'HTTP_AUTHORIZATION': 'Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=\n'}
54+
self.assertTrue(self.validator._authenticate_basic_auth(self.request))
55+
56+
def test_authenticate_basic_auth_wrong_client_id(self):
57+
self.request.encoding = 'utf-8'
58+
# wrong_id:client_secret
59+
self.request.headers = {'HTTP_AUTHORIZATION': 'Basic d3JvbmdfaWQ6Y2xpZW50X3NlY3JldA==\n'}
60+
self.assertFalse(self.validator._authenticate_basic_auth(self.request))
61+
62+
def test_authenticate_basic_auth_wrong_client_secret(self):
63+
self.request.encoding = 'utf-8'
64+
# client_id:wrong_secret
65+
self.request.headers = {'HTTP_AUTHORIZATION': 'Basic Y2xpZW50X2lkOndyb25nX3NlY3JldA==\n'}
66+
self.assertFalse(self.validator._authenticate_basic_auth(self.request))
67+
68+
def test_authenticate_basic_auth_not_b64_auth_string(self):
69+
self.request.encoding = 'utf-8'
70+
# Can't b64decode
71+
self.request.headers = {'HTTP_AUTHORIZATION': 'Basic not_base64'}
72+
self.assertFalse(self.validator._authenticate_basic_auth(self.request))
73+
74+
def test_authenticate_basic_auth_not_utf8(self):
75+
self.request.encoding = 'utf-8'
76+
# b64decode('test') will become b'\xb5\xeb-', it can't be decoded as utf-8
77+
self.request.headers = {'HTTP_AUTHORIZATION': 'Basic test'}
78+
self.assertFalse(self.validator._authenticate_basic_auth(self.request))
4579

4680
def test_authenticate_client_id(self):
4781
self.assertTrue(self.validator.authenticate_client_id('client_id', self.request))

0 commit comments

Comments
 (0)