Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Commit 6b59b2a

Browse files
committed
Check if nonce values are the same.
Deal with missing attribute.
1 parent 37d5a24 commit 6b59b2a

2 files changed

Lines changed: 53 additions & 15 deletions

File tree

src/oidcrp/oidc/authorization.py

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22

3+
from oidcmsg import oauth2
34
from oidcmsg import oidc
45
from oidcmsg.oidc import make_openid_request
56
from oidcmsg.oidc import verified_claim_name
@@ -47,18 +48,20 @@ def set_state(self, request_args, **kwargs):
4748

4849
def update_service_context(self, resp, key='', **kwargs):
4950
_context = self.client_get("service_context")
50-
try:
51-
_idt = resp[verified_claim_name('id_token')]
52-
except KeyError:
53-
pass
54-
else:
51+
52+
_idt = resp.get(verified_claim_name('id_token'))
53+
if _idt:
5554
# If there is a verified ID Token then we have to do nonce
5655
# verification
57-
try:
58-
if _context.state.get_state_by_nonce(_idt['nonce']) != key:
59-
raise ParameterError('Someone has messed with "nonce"')
60-
except KeyError:
61-
raise ValueError('Missing nonce value')
56+
item = _context.state.get_item(oauth2.AuthorizationRequest, 'auth_request', key)
57+
if item['nonce'] != _idt['nonce']:
58+
raise ValueError('Invalid nonce')
59+
60+
# try:
61+
# if _context.state.get_state_by_nonce(_idt['nonce']) != key:
62+
# raise ParameterError('Someone has messed with "nonce"')
63+
# except KeyError:
64+
# raise ValueError('Invalid nonce')
6265

6366
_context.state.store_sub2state(_idt['sub'], key)
6467

@@ -229,6 +232,33 @@ def oidc_post_construct(self, req, **kwargs):
229232

230233
return req
231234

235+
# def post_parse_response(self, response, **kwargs):
236+
# """
237+
# Add scope claim to response, from the request, if not present in the
238+
# response
239+
#
240+
# :param response: The response
241+
# :param kwargs: Extra Keyword arguments
242+
# :return: A possibly augmented response
243+
# """
244+
#
245+
# authorization.Authorization.parse_response(self, response, **kwargs)
246+
#
247+
# if "id_token" not in response:
248+
# try:
249+
# _key = kwargs['state']
250+
# except KeyError:
251+
# pass
252+
# else:
253+
# if _key:
254+
# item = self.client_get("service_context").state.get_item(oauth2.AuthorizationRequest,
255+
# 'auth_request', _key)
256+
# try:
257+
# response["scope"] = item["scope"]
258+
# except KeyError:
259+
# pass
260+
# return response
261+
232262
def gather_verify_arguments(self):
233263
"""
234264
Need to add some information before running verify()
@@ -242,6 +272,10 @@ def gather_verify_arguments(self):
242272
'skew': _context.clock_skew
243273
}
244274

275+
_nonce = _context.state.get_item(oauth2.AuthorizationRequest, 'auth_request', 'nonce')
276+
if _nonce:
277+
kwargs["nonce"] = _nonce
278+
245279
_client_id = _context.client_id
246280
if _client_id:
247281
kwargs['client_id'] = _client_id

src/oidcrp/rp_handler.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from cryptojwt.utils import as_bytes
1010
from oidcmsg import verified_claim_name
1111
from oidcmsg.exception import MessageException
12+
from oidcmsg.exception import MissingRequiredAttribute
1213
from oidcmsg.exception import NotForMe
1314
from oidcmsg.oauth2 import ResponseMessage
1415
from oidcmsg.oauth2 import is_error_message
@@ -628,16 +629,14 @@ def finalize_auth(self, client, issuer: str, response: dict,
628629

629630
_srv = client.get_service('authorization')
630631
try:
631-
authorization_response = _srv.parse_response(response,
632-
sformat='dict')
632+
authorization_response = _srv.parse_response(response, sformat='dict')
633633
except Exception as err:
634634
logger.error('Parsing authorization_response: {}'.format(err))
635635
message = traceback.format_exception(*sys.exc_info())
636636
logger.error(message)
637637
raise
638638
else:
639-
logger.debug(
640-
'Authz response: {}'.format(authorization_response.to_dict()))
639+
logger.debug('Authz response: {}'.format(authorization_response.to_dict()))
641640

642641
if is_error_message(authorization_response):
643642
return authorization_response
@@ -947,8 +946,10 @@ def backchannel_logout(client, request='', request_args=None):
947946
"""
948947
if request:
949948
req = BackChannelLogoutRequest().from_urlencoded(as_unicode(request))
949+
elif request_args:
950+
req = BackChannelLogoutRequest(**request_args)
950951
else:
951-
req = BackChannelLogoutRequest()
952+
raise MissingRequiredAttribute('logout_token')
952953

953954
_context = client.client_get("service_context")
954955
kwargs = {
@@ -959,10 +960,13 @@ def backchannel_logout(client, request='', request_args=None):
959960
"id_token_signed_response_alg", "RS256")
960961
}
961962

963+
logger.debug(f"(backchannel_logout) Verifying request using: {kwargs}")
962964
try:
963965
req.verify(**kwargs)
964966
except (MessageException, ValueError, NotForMe) as err:
965967
raise MessageException('Bogus logout request: {}'.format(err))
968+
else:
969+
logger.debug("Request verified OK")
966970

967971
# Find the subject through 'sid' or 'sub'
968972
sub = req[verified_claim_name('logout_token')].get('sub')

0 commit comments

Comments
 (0)