44from typing import Optional
55from typing import Union
66
7- from cryptojwt import JWS
87from cryptojwt import as_unicode
8+ from cryptojwt import JWS
99from cryptojwt .jwk .jwk import key_from_jwk_dict
1010from cryptojwt .jws .jws import factory
1111
12+ from idpyoidc .message import Message
1213from idpyoidc .message import SINGLE_OPTIONAL_STRING
1314from idpyoidc .message import SINGLE_REQUIRED_INT
1415from idpyoidc .message import SINGLE_REQUIRED_JSON
1516from idpyoidc .message import SINGLE_REQUIRED_STRING
16- from idpyoidc .message import Message
1717from idpyoidc .metadata import get_signing_algs
1818from idpyoidc .server .client_authn import BearerHeader
1919
@@ -130,6 +130,7 @@ def userinfo_post_parse_request(request, client_id, context, auth_info, **kwargs
130130 """
131131 Expect http_info attribute in kwargs. http_info should be a dictionary
132132 containing HTTP information.
133+ This function is ment for DPoP-protected resources.
133134
134135 :param request:
135136 :param client_id:
@@ -179,26 +180,37 @@ def token_args(context, client_id, token_args: Optional[dict] = None):
179180 return token_args
180181
181182
183+ def _add_to_context (endpoint , algs_supported ):
184+ _context = endpoint .upstream_get ("context" )
185+ _context .provider_info ["dpop_signing_alg_values_supported" ] = algs_supported
186+ _context .add_on ["dpop" ] = {"algs_supported" : algs_supported }
187+ _context .client_authn_methods ["dpop" ] = DPoPClientAuth
188+
189+
182190def add_support (endpoint : dict , ** kwargs ):
183- # Pick one endpoint
184- _endp_name = list (endpoint .keys ())[0 ]
185- _endp = endpoint [_endp_name ]
186- _endp .post_parse_request .append (token_post_parse_request )
191+ # Pick the token endpoint
192+ _endp = endpoint .get ("token" , None )
193+ if _endp :
194+ _endp .post_parse_request .append (token_post_parse_request )
195+ _added_to_context = False
187196
188197 _algs_supported = kwargs .get ("dpop_signing_alg_values_supported" )
189198 if not _algs_supported :
190199 _algs_supported = ["RS256" ]
191200 else :
192201 _algs_supported = [alg for alg in _algs_supported if alg in get_signing_algs ()]
193202
194- _context = _endp .upstream_get ("context" )
195- _context .provider_info ["dpop_signing_alg_values_supported" ] = _algs_supported
196- _context .add_on ["dpop" ] = {"algs_supported" : _algs_supported }
197- _context .client_authn_methods ["dpop" ] = DPoPClientAuth
203+ if _endp :
204+ _add_to_context (_endp , _algs_supported )
205+ _added_to_context = True
198206
199207 for _dpop_endpoint in kwargs .get ("dpop_endpoints" , ["userinfo" ]):
200208 _endpoint = endpoint .get (_dpop_endpoint , None )
201209 if _endpoint :
210+ if not _added_to_context :
211+ _add_to_context (_endp , _algs_supported )
212+ _added_to_context = True
213+
202214 _endpoint .post_parse_request .append (userinfo_post_parse_request )
203215
204216
@@ -214,12 +226,12 @@ def is_usable(self, request=None, authorization_token=None, http_headers=None):
214226 return False
215227
216228 def verify (
217- self ,
218- request : Optional [Union [dict , Message ]] = None ,
219- authorization_token : Optional [str ] = None ,
220- endpoint = None , # Optional[Endpoint]
221- get_client_id_from_token : Optional [Callable ] = None ,
222- ** kwargs ,
229+ self ,
230+ request : Optional [Union [dict , Message ]] = None ,
231+ authorization_token : Optional [str ] = None ,
232+ endpoint = None , # Optional[Endpoint]
233+ get_client_id_from_token : Optional [Callable ] = None ,
234+ ** kwargs ,
223235 ):
224236 # info contains token and client_id
225237 info = BearerHeader ._verify (
0 commit comments