
    k7i                     r    S SK r S SKJr  S SKJr  SSKJr  Sr\ R                  " \	5      r
 " S S5      rS	 rg)
    N)jwt)	JoseError   )InvalidClientErrorz6urn:ietf:params:oauth:client-assertion-type:jwt-bearerc                   T    \ rS rSrSr\rSrSS jrS r	S r
S rS rS	 rS
 rS rSrg)JWTBearerClientAssertion   zUImplementation of Using JWTs for Client Authentication, which is
defined by RFC7523.
client_assertion_jwtc                 (    Xl         X l        X0l        g )N)	token_url_validate_jtileeway)selfr   validate_jtir   s       W/home/james-whalen/.local/lib/python3.13/site-packages/authlib/oauth2/rfc7523/client.py__init__!JWTBearerClientAssertion.__init__   s    ")     c                 <   UR                   nUR                  S5      nUR                  S5      nU[        :X  aD  U(       a=  U R                  X5      nU R	                  XV5        U R                  UR                  5      $ [        R                  SU R                  5        g )Nclient_assertion_typeclient_assertionzAuthenticate via %r failed)
formgetASSERTION_TYPEcreate_resolve_key_funcprocess_assertion_claimsauthenticate_clientclientlogdebugCLIENT_AUTH_METHOD)r   query_clientrequestdataassertion_type	assertionresolve_keys          r   __call__!JWTBearerClientAssertion.__call__   s{    ||"9:HH/0	^+	66|MK)))A++GNN;;		.0G0GHr   c                     S[         S.SS0SU R                  S.SS0S.nU R                  (       a  SU R                  S.US'   U$ )z}Create a claims_options for verify JWT payload claims. Developers
MAY overwrite this method to create a more strict options.
T)	essentialvalidater+   )r+   value)isssubaudexpjti)_validate_issr   r   r   )r   optionss     r   create_claims_options.JWTBearerClientAssertion.create_claims_options'   sS     "&=A&!%?&	
 +/T=N=NOGENr   c                      [         R                  " XU R                  5       S9nUR                  U R                  S9  U$ ! [
         a/  n[        R                  SU5        [        UR                  S9UeSnAff = f)a)  Extract JWT payload claims from request "assertion", per
`Section 3.1`_.

:param assertion: assertion string value in the request
:param resolve_key: function to resolve the sign key
:return: JWTClaims
:raise: InvalidClientError

.. _`Section 3.1`: https://tools.ietf.org/html/rfc7523#section-3.1
)claims_options)r   zAssertion Error: %rdescriptionN)
r   decoder5   r,   r   r   r   r    r   r:   )r   r&   r'   claimses        r   r   1JWTBearerClientAssertion.process_assertion_claims7   ss    	GZZt7Q7Q7SF OO4;;O/   	GII+Q/$?QF	Gs   <A   
A9
*A44A9c                 t    UR                  U R                  S5      (       a  U$ [        SU R                   3S9e)Ntokenz,The client cannot authenticate with method: r9   )check_endpoint_auth_methodr!   r   )r   r   s     r   r   ,JWTBearerClientAssertion.authenticate_clientL   s>    ,,T-D-DgNNM FtG^G^F_`
 	
r   c                    ^ ^^ UUU 4S jnU$ )Nc                 n   > US   nT" U5      nU(       d	  [        SS9eUTl        TR                  X05      $ )Nr/   z)The client does not exist on this server.r9   )r   r   resolve_client_public_key)headerspayload	client_idr   r"   r#   r   s       r   r'   EJWTBearerClientAssertion.create_resolve_key_func.<locals>.resolve_keyT   sE      I!),F( K  $GN11&BBr    )r   r"   r#   r'   s   ``` r   r   0JWTBearerClientAssertion.create_resolve_key_funcS   s    	C r   c                     [        5       e)a&  Validate if the given ``jti`` value is used before. Developers
MUST implement this method::

    def validate_jti(self, claims, jti):
        key = "jti:{}-{}".format(claims["sub"], jti)
        if redis.get(key):
            return False
        redis.set(key, 1, ex=3600)
        return True
NotImplementedError)r   r<   r2   s      r   r   %JWTBearerClientAssertion.validate_jtic   s     "##r   c                     [        5       e)a&  Resolve the client public key for verifying the JWT signature.
A client may have many public keys, in this case, we can retrieve it
via ``kid`` value in headers. Developers MUST implement this method::

    def resolve_client_public_key(self, client, headers):
        return client.public_key
rM   )r   r   rF   s      r   rE   2JWTBearerClientAssertion.resolve_client_public_keyp   s     "##r   )r   r   r   N)T<   )__name__
__module____qualname____firstlineno____doc__r   CLIENT_ASSERTION_TYPEr!   r   r(   r5   r   r   r   r   rE   __static_attributes__rJ   r   r   r   r      s>    
 +/I *
 $$r   r   c                     U S   U:H  $ )Nr/   rJ   )r<   r.   s     r   r3   r3   {   s    %=Cr   )loggingauthlib.joser   authlib.jose.errorsr   rfc6749r   r   	getLoggerrS   r   r   r3   rJ   r   r   <module>r`      s8      ) (I!l$ l$^ r   