Skip to content

Commit 0369557

Browse files
klausenbuskanthraxx
authored andcommitted
fix(sso): adapt to authlib 1.0.0 behaviour
A undocumented change[1] in authlib 1.0.0. [1] authlib/authlib#400
1 parent 7d5f7d6 commit 0369557

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

test/test_sso.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from tracker.view.login import LOGIN_ERROR_MISSING_EMAIL_FROM_TOKEN
1919
from tracker.view.login import LOGIN_ERROR_MISSING_GROUPS_FROM_TOKEN
2020
from tracker.view.login import LOGIN_ERROR_MISSING_USER_SUB_FROM_TOKEN
21+
from tracker.view.login import LOGIN_ERROR_MISSING_USERINFO_FROM_TOKEN
2122
from tracker.view.login import LOGIN_ERROR_MISSING_USERNAME_FROM_TOKEN
2223
from tracker.view.login import LOGIN_ERROR_PERMISSION_DENIED
2324
from tracker.view.login import \
@@ -34,20 +35,23 @@
3435

3536
class MockedIdp(object):
3637
def __init__(self, username=TESTINGNAME, email=DEFAULTEMAIL, sub=TESTINGSUB, groups=["Administrator"],
37-
verified=True, throws=None):
38+
verified=True, throws=None, has_userinfo=True):
3839
self.email = email
3940
self.sub = sub
4041
self.groups = groups
4142
self.verified = verified
4243
self.username = username
4344
self.throws = throws
45+
self.has_userinfo = has_userinfo
4446

4547
def authorize_access_token(self):
4648
if self.throws:
4749
raise self.throws
48-
return "Schinken"
50+
if self.has_userinfo:
51+
return {'userinfo': self.parse_id_token(None, None)}
52+
return {}
4953

50-
def parse_id_token(self, token):
54+
def parse_id_token(self, token, nonce, claims_options=None, leeway=120):
5155
token = {}
5256
if self.sub is not None:
5357
token["sub"] = self.sub
@@ -147,6 +151,15 @@ def test_permission_denied_lack_of_group(app, db):
147151
assert not current_user.is_authenticated
148152
assert not User.query.all()
149153

154+
@patch('tracker.oauth.idp', MockedIdp(has_userinfo=False), create=True)
155+
def test_missing_userinfo_from_token(app, db):
156+
with app.test_request_context('/login'):
157+
result = sso_auth()
158+
assert BadRequest.code == result.status_code
159+
assert LOGIN_ERROR_MISSING_USERINFO_FROM_TOKEN in result.data.decode()
160+
161+
assert not current_user.is_authenticated
162+
assert not User.query.all()
150163

151164
@patch('tracker.oauth.idp', MockedIdp(sub=None), create=True)
152165
def test_missing_sub_from_token(app, db):

tracker/view/login.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
LOGIN_ERROR_MISSING_EMAIL_FROM_TOKEN = "Missing email address from token"
3535
LOGIN_ERROR_MISSING_USERNAME_FROM_TOKEN = "Missing username from token"
3636
LOGIN_ERROR_MISSING_GROUPS_FROM_TOKEN = "Missing groups from token"
37+
LOGIN_ERROR_MISSING_USERINFO_FROM_TOKEN = "Missing userinfo from token"
3738

3839

3940
@tracker.route('/login', methods=['GET', 'POST'])
@@ -86,27 +87,30 @@ def logout():
8687
def sso_auth():
8788
try:
8889
token = oauth.idp.authorize_access_token()
89-
parsed_token = oauth.idp.parse_id_token(token)
9090
except AuthlibBaseError as e:
9191
return bad_request(f'{e.description}')
9292

93-
idp_user_sub = parsed_token.get('sub')
93+
userinfo = token.get('userinfo')
94+
if not userinfo:
95+
return bad_request(LOGIN_ERROR_MISSING_USERINFO_FROM_TOKEN)
96+
97+
idp_user_sub = userinfo.get('sub')
9498
if not idp_user_sub:
9599
return bad_request(LOGIN_ERROR_MISSING_USER_SUB_FROM_TOKEN)
96100

97-
idp_email_verified = parsed_token.get('email_verified')
101+
idp_email_verified = userinfo.get('email_verified')
98102
if not idp_email_verified:
99103
return forbidden(LOGIN_ERROR_EMAIL_ADDRESS_NOT_VERIFIED)
100104

101-
idp_email = parsed_token.get('email')
105+
idp_email = userinfo.get('email')
102106
if not idp_email:
103107
return bad_request(LOGIN_ERROR_MISSING_EMAIL_FROM_TOKEN)
104108

105-
idp_username = parsed_token.get('preferred_username')
109+
idp_username = userinfo.get('preferred_username')
106110
if not idp_username:
107111
return bad_request(LOGIN_ERROR_MISSING_USERNAME_FROM_TOKEN)
108112

109-
idp_groups = parsed_token.get('groups')
113+
idp_groups = userinfo.get('groups')
110114
if idp_groups is None:
111115
return bad_request(LOGIN_ERROR_MISSING_GROUPS_FROM_TOKEN)
112116

0 commit comments

Comments
 (0)