o
    Df!                     @   sd   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 G dd	 d	e
ZdS )
    N)List)Optional)Uniongenerate_token)jwt)BearerTokenGeneratorc                       s   e Zd ZdZ			d fdd	Zdd Zdd	 Zd
eee	e f fddZ
d
ee fddZd
ee fddZd
ee	e  fddZd
efddZdd Z  ZS )JWTBearerTokenGeneratora  A JWT formatted access token generator.

    :param issuer: The issuer identifier. Will appear in the JWT ``iss`` claim.

    :param \*\*kwargs: Other parameters are inherited from
        :class:`~authlib.oauth2.rfc6750.token.BearerTokenGenerator`.

    This token generator can be registered into the authorization server::

        class MyJWTBearerTokenGenerator(JWTBearerTokenGenerator):
            def get_jwks(self):
                ...

            def get_extra_claims(self, client, grant_type, user, scope):
                ...

        authorization_server.register_token_generator(
            'default',
            MyJWTBearerTokenGenerator(issuer='https://authorization-server.example.org'),
        )
    RS256Nc                    s"   t  | j|| || _|| _d S )N)super__init__access_token_generatorissueralg)selfr   r   refresh_token_generatorexpires_generator	__class__ U/home/ubuntu/webapp/venv/lib/python3.10/site-packages/authlib/oauth2/rfc9068/token.pyr   "   s
   
z JWTBearerTokenGenerator.__init__c                 C   s   t  )zReturn the JWKs that will be used to sign the JWT access token.
        Developers MUST re-implement this method::

            def get_jwks(self):
                return load_jwks("jwks.json")
        )NotImplementedError)r   r   r   r   get_jwks/   s   z JWTBearerTokenGenerator.get_jwksc                 C   s   i S )aY  Return extra claims to add in the JWT access token. Developers MAY
        re-implement this method to add identity claims like the ones in
        :ref:`specs/oidc` ID Token, or any other arbitrary claims::

            def get_extra_claims(self, client, grant_type, user, scope):
                return generate_user_info(user, scope)
        r   r   client
grant_typeuserscoper   r   r   get_extra_claims8   s   z(JWTBearerTokenGenerator.get_extra_claimsreturnc                 C   s   |  S )ak  Return the audience for the token. By default this simply returns
        the client ID. Developpers MAY re-implement this method to add extra
        audiences::

            def get_audiences(self, client, user, scope):
                return [
                    client.get_client_id(),
                    resource_server.get_id(),
                ]
        )get_client_id)r   r   r   r   r   r   r   get_audiencesB   s   z%JWTBearerTokenGenerator.get_audiencesc                 C      dS )a  Authentication Context Class Reference.
        Returns a user-defined case sensitive string indicating the class of
        authentication the used performed. Token audience may refuse to give access to
        some resources if some ACR criterias are not met.
        :ref:`specs/oidc` defines one special value: ``0`` means that the user
        authentication did not respect `ISO29115`_ level 1, and will be refused monetary
        operations. Developers MAY re-implement this method::

            def get_acr(self, user):
                if user.insecure_session():
                    return '0'
                return 'urn:mace:incommon:iap:silver'

        .. _ISO29115: https://www.iso.org/standard/45138.html
        Nr   r   r   r   r   r   get_acrO   s   zJWTBearerTokenGenerator.get_acrc                 C   r"   )a}  User authentication time.
        Time when the End-User authentication occurred. Its value is a JSON number
        representing the number of seconds from 1970-01-01T0:0:0Z as measured in UTC
        until the date/time. Developers MAY re-implement this method::

            def get_auth_time(self, user):
                return datetime.timestamp(user.get_auth_time())
        Nr   r#   r   r   r   get_auth_timea      	z%JWTBearerTokenGenerator.get_auth_timec                 C   r"   )a{  Authentication Methods References.
        Defined by :ref:`specs/oidc` as an option list of user-defined case-sensitive
        strings indication which authentication methods have been used to authenticate
        the user. Developers MAY re-implement this method::

            def get_amr(self, user):
                return ['2FA'] if user.has_2fa_enabled() else []
        Nr   r#   r   r   r   get_amrl   r&   zJWTBearerTokenGenerator.get_amrc                 C   s   t dS )zJWT ID.
        Create an unique identifier for the token. Developers MAY re-implement
        this method::

            def get_jti(self, client, grant_type, user scope):
                return generate_random_string(16)
           r   r   r   r   r   get_jtiw   s   zJWTBearerTokenGenerator.get_jtic              
   C   s   t t }|| || }| j|| || |||||d}|r)| |d< n| |d< 	 | ||||d< | | }rD||d< | 	| }	rO|	|d< | 
| }
rZ|
|d< || |||| | jdd	}tj|||  dd
}| S )N)issexp	client_idiatjtir   subFaud	auth_timeacramrzat+jwt)r   typ)keycheck)inttime_get_expires_inr   r    r)   get_user_idr!   r%   r$   r'   updater   r   r   encoder   decode)r   r   r   r   r   now
expires_in
token_datar1   r2   r3   headeraccess_tokenr   r   r   r      s:   
z.JWTBearerTokenGenerator.access_token_generator)r
   NN)__name__
__module____qualname____doc__r   r   r   r   strr   r!   r   r$   r7   r%   r'   r)   r   __classcell__r   r   r   r   r	      s    	

r	   )r8   typingr   r   r   authlib.common.securityr   authlib.joser   authlib.oauth2.rfc6750.tokenr   r	   r   r   r   r   <module>   s    