o
    0=jáK  ã                   @   sÚ  d Z ddlZddlZddlZ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
ZddlZddlZddlmZ ddlmZ dd	lmZ d
ZdZdZdZeejdd� ¡ ƒZeejdd� ¡ ƒZeejdd� ¡ ƒZdZeg d¢ƒZdZdZ dZ!dZ"G dd„ dej#j$j%ƒZ&G dd„ dƒZ'G dd„ dƒZ(G d d!„ d!e	j)ƒZ*G d"d#„ d#ƒZ+G d$d%„ d%ƒZ,G d&d'„ d'ej-ƒZ.G d(d)„ d)ej-ƒZ/G d*d+„ d+ej0ƒZ1G d,d-„ d-ej0ƒZ2G d.d/„ d/ej3ƒZ4G d0d1„ d1e4ƒZ5G d2d3„ d3e4ƒZ6dS )4z1Firebase token minting and validation sub module.é    N)Úcredentials)Úiam)Újwt)Ú	transport)Ú
exceptions)Ú_auth_utils)Ú_http_clientzhttps://securetoken.google.com/zXhttps://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.comz$https://session.firebase.google.com/zEhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeysé   )Úminutesé   )Údaysé   )ÚhourszYhttps://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit)ZacrZamrZat_hashÚaudZ	auth_timeZazpZcnfZc_hashÚexpZfirebaseÚiatÚissZjtiZnbfÚnonceÚsubzZhttp://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/emailÚRS256Únonez"firebase-auth-emulator@example.comc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_EmulatedSignerNc                 C   s   d S ©N© ©Úselfr   r   úcC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\firebase_admin/_token_gen.pyÚ__init__B   ó   z_EmulatedSigner.__init__c                 C   s   dS )Nó    r   ©r   Úmessager   r   r   ÚsignE   r   z_EmulatedSigner.sign)Ú__name__Ú
__module__Ú__qualname__Zkey_idr   r"   r   r   r   r   r   ?   s    r   c                   @   sd   e Zd ZdZefdd„Zedd„ ƒZedd„ ƒZedd	„ ƒZ	e
d
d„ ƒZe
dd„ ƒZe
dd„ ƒZdS )Ú_SigningProviderz2Stores a reference to a google.auth.crypto.Signer.c                 C   s   || _ || _|| _d S r   )Ú_signerÚ_signer_emailÚ_alg)r   ÚsignerÚsigner_emailÚalgr   r   r   r   L   s   
z_SigningProvider.__init__c                 C   ó   | j S r   )r'   r   r   r   r   r*   Q   ó   z_SigningProvider.signerc                 C   r-   r   )r(   r   r   r   r   r+   U   r.   z_SigningProvider.signer_emailc                 C   r-   r   )r)   r   r   r   r   r,   Y   r.   z_SigningProvider.algc                 C   s   t |j|jƒS r   )r&   r*   r+   )ÚclsÚgoogle_credr   r   r   Úfrom_credential]   ó   z _SigningProvider.from_credentialc                 C   s   t  |||¡}t||ƒS r   )r   ÚSignerr&   )r/   Úrequestr0   Úservice_accountr*   r   r   r   Úfrom_iama   s   
z_SigningProvider.from_iamc                 C   s   t tƒ ttƒS r   )r&   r   ÚAUTH_EMULATOR_EMAILÚALGORITHM_NONE)r/   r   r   r   Úfor_emulatorf   r2   z_SigningProvider.for_emulatorN)r#   r$   r%   Ú__doc__ÚALGORITHM_RS256r   Úpropertyr*   r+   r,   Úclassmethodr1   r6   r9   r   r   r   r   r&   I   s    




r&   c                   @   sD   e Zd ZdZdZddd„Zdd„ Zedd	„ ƒZdd
d„Z	dd„ Z
dS )ÚTokenGeneratorz,Generates custom tokens and session cookies.z)https://identitytoolkit.googleapis.com/v1Nc                 C   s>   || _ || _tj ¡ | _|p| j}|› d|j› �| _d | _	d S )Nz
/projects/)
ÚappÚhttp_clientr   ÚrequestsÚRequestr4   ÚID_TOOLKIT_URLÚ
project_idÚbase_urlÚ_signing_provider)r   r?   r@   Zurl_overrideZ
url_prefixr   r   r   r   p   s   

zTokenGenerator.__init__c                 C   sº   t  ¡ rt ¡ S | jj ¡ }t|tj	j
jƒrt |¡S | jj d¡}|r,t | j||¡S t|tjƒr7t |¡S | jtddid�}|jdkrPtd|j ¡ › d�ƒ‚|j ¡ }t | j||¡S )	zPInitializes a signing provider by following the go/firebase-admin-sign protocol.ZserviceAccountIdzMetadata-FlavorZGoogle)ÚurlÚheaderséÈ   z.Failed to contact the local metadata service: Ú.N)r   Úis_emulatedr&   r9   r?   Z
credentialÚget_credentialÚ
isinstanceÚgoogleÚoauth2r5   ÚCredentialsr1   ÚoptionsÚgetr6   r4   r   ZSigningÚMETADATA_SERVICE_URLÚstatusÚ
ValueErrorÚdataÚdecode)r   r0   r5   Úrespr   r   r   Ú_init_signing_providerx   s"   


ÿ
z%TokenGenerator._init_signing_providerc              
   C   sT   | j s'z	|  ¡ | _ W | j S  ty& } zd}td|› d|› d�ƒ|‚d}~ww | j S )z@Initializes and returns the SigningProvider instance to be used.z@https://firebase.google.com/docs/auth/admin/create-custom-tokensz%Failed to determine service account: z¡. Make sure to initialize the SDK with service account credentials or specify a service account ID with iam.serviceAccounts.signBlob permission. Please refer to z, for more details on creating custom tokens.N)rF   rY   Ú	ExceptionrU   )r   ÚerrorrG   r   r   r   Úsigning_provider•   s    ùþÿü€þzTokenGenerator.signing_providerc              
   C   s,  |dur7t |tƒstdƒ‚t| ¡ ƒt@ }|r7t|ƒdkr*dd |¡› d�}t|ƒ‚dd |¡› d�}t|ƒ‚|rDt |tƒrDt|ƒd	krHtd
ƒ‚| j	}t
t ¡ ƒ}|j|jt|||t dœ}|rd||d< |durl||d< d|ji}	z
tj|j||	d�W S  tjjjy• }
 zd|
› �}t||
ƒ|
‚d}
~
ww )z.Builds and signs a Firebase custom auth token.Nz%developer_claims must be a dictionaryr   zDeveloper claims z, z& are reserved and cannot be specified.zDeveloper claim z% is reserved and cannot be specified.é€   z2uid must be a string between 1 and 128 characters.)r   r   r   Úuidr   r   Ú	tenant_idZclaimsr,   )ÚheaderzFailed to sign custom token. )rM   ÚdictrU   ÚsetÚkeysÚRESERVED_CLAIMSÚlenÚjoinÚstrr\   ÚintÚtimer+   ÚFIREBASE_AUDIENCEÚMAX_TOKEN_LIFETIME_SECONDSr,   r   Úencoder*   rN   Úauthr   ÚTransportErrorÚTokenSignError)r   r^   Zdeveloper_claimsr_   Zdisallowed_keysÚerror_messager\   ÚnowÚpayloadr`   r[   Úmsgr   r   r   Úcreate_custom_token¤   sF   
ÿþÿú

€þz"TokenGenerator.create_custom_tokenc              
   C   s,  t |tƒr
| d¡n|}t |tƒr|std|› d�ƒ‚t |tjƒr't| ¡ ƒ}t |t	ƒs1t |tƒs9td|› d�ƒ‚|t
k rHtd|› dt
› d�ƒ‚|tkrWtd|› dt› d�ƒ‚| j› d	�}||d
œ}z| jjd||d�\}}W n tjjy‚ } zt |¡‚d}~ww |rŠ| d¡s‘tjd|d�‚| d¡S )z4Creates a session cookie from the provided ID token.úutf-8zIllegal ID token provided: z&. ID token must be a non-empty string.zIllegal expiry duration: rJ   z. Duration must be at least z	 seconds.z. Duration must be at most z:createSessionCookie)ZidTokenZvalidDurationÚpost)ÚjsonNZsessionCookiez Failed to create session cookie.)Úhttp_response)rM   ÚbytesrW   rg   rU   ÚdatetimeÚ	timedeltarh   Útotal_secondsÚboolÚ#MIN_SESSION_COOKIE_DURATION_SECONDSÚ#MAX_SESSION_COOKIE_DURATION_SECONDSrE   r@   Zbody_and_responserA   r   ÚRequestExceptionr   Zhandle_auth_backend_errorrR   ZUnexpectedResponseError)r   Úid_tokenZ
expires_inrG   rr   ÚbodyZ	http_respr[   r   r   r   Úcreate_session_cookieÑ   sH   
ÿÿÿÿÿþ
€ÿÿ
z$TokenGenerator.create_session_cookier   )NN)r#   r$   r%   r:   rC   r   rY   r<   r\   rt   rƒ   r   r   r   r   r>   k   s    


-r>   c                   @   s<   e Zd ZdZddd„Zedd„ ƒZedd„ ƒZdd
d„ZdS )ÚCertificateFetchRequestzyA google-auth transport that supports HTTP cache-control.

    Also injects a timeout to each outgoing HTTP request.
    Nc                 C   s*   t  t ¡ ¡| _tj | j¡| _|| _	d S r   )
ÚcachecontrolÚCacheControlrA   ÚSessionÚ_sessionr   rB   ÚsessionÚ	_delegateÚ_timeout_seconds)r   Útimeout_secondsr   r   r   r   ú   s   
z CertificateFetchRequest.__init__c                 C   r-   r   )rˆ   r   r   r   r   r‰   ÿ   r.   zCertificateFetchRequest.sessionc                 C   r-   r   )r‹   r   r   r   r   rŒ     r.   z'CertificateFetchRequest.timeout_secondsÚGETc                 K   s&   |p| j }| j|f||||dœ|¤ŽS )N)Úmethodr‚   rH   Útimeout)rŒ   rŠ   )r   rG   rŽ   r‚   rH   r�   Úkwargsr   r   r   Ú__call__  s   
ÿÿÿz CertificateFetchRequest.__call__r   )r�   NNN)	r#   r$   r%   r:   r   r<   r‰   rŒ   r‘   r   r   r   r   r„   ô   s    


r„   c                   @   s,   e Zd ZdZdd„ Zd
dd„Zd
dd„Zd	S )ÚTokenVerifierz'Verifies ID tokens and session cookies.c              
   C   sX   |j  dtj¡}t|ƒ| _t|jdddtt	t
jtd�| _t|jdddttttd�| _d S )NZhttpTimeoutzID tokenzverify_id_token()z<https://firebase.google.com/docs/auth/admin/verify-id-tokens)rD   Ú
short_nameÚ	operationÚdoc_urlÚcert_urlÚissuerÚinvalid_token_errorÚexpired_token_errorzsession cookiezverify_session_cookie())rQ   rR   r   ZDEFAULT_TIMEOUT_SECONDSr„   r4   Ú_JWTVerifierrD   ÚID_TOKEN_CERT_URIÚID_TOKEN_ISSUER_PREFIXr   ÚInvalidIdTokenErrorÚExpiredIdTokenErrorÚid_token_verifierÚCOOKIE_CERT_URIÚCOOKIE_ISSUER_PREFIXÚInvalidSessionCookieErrorÚExpiredSessionCookieErrorÚcookie_verifier)r   r?   r�   r   r   r   r     s(   
ùùzTokenVerifier.__init__r   c                 C   ó   | j  || j|¡S r   )rŸ   Úverifyr4   )r   r�   Úclock_skew_secondsr   r   r   Úverify_id_token$  ó   zTokenVerifier.verify_id_tokenc                 C   r¥   r   )r¤   r¦   r4   )r   Úcookier§   r   r   r   Úverify_session_cookie'  r©   z#TokenVerifier.verify_session_cookieN©r   )r#   r$   r%   r:   r   r¨   r«   r   r   r   r   r’     s
    
r’   c                   @   s*   e Zd ZdZdd„ Zd
dd„Zdd„ Zd	S )rš   z6Verifies Firebase JWTs (ID tokens or session cookies).c                 K   s”   |  d¡| _|  d¡| _|  d¡| _|  d¡| _|  d¡| _|  d¡| _| jd  ¡ dv r5d	| j› �| _nd
| j› �| _|  d¡| _	|  d¡| _
d S )NrD   r“   r”   r•   r–   r—   r   Zaeiouzan za r˜   r™   )ÚpoprD   r“   r”   rG   r–   r—   ÚlowerÚarticled_short_nameÚ_invalid_token_errorÚ_expired_token_error)r   r�   r   r   r   r   .  s   z_JWTVerifier.__init__r   c              
   C   s"  t |tƒr
| d¡n|}t |tƒr|s#td| j› d|› d| j› d�ƒ‚| js/td| j› d�ƒ‚|dk s7|d	kr?td
|› d�ƒ‚|  |¡\}}| 	d¡}| 	d¡}| 	d¡}| j
| j }	d| j› d�}
d| j› d| j› d�}t ¡ }d}|tkr‚| j› d| j› d�}n«|s²| 	d¡s²| 	d¡dkrª| 	d¡dkrªd| 	di ¡v rª| j› d| j› d�}nƒd| j› d�}n{|sË| 	d¡d krËd| j› d!| 	d¡› d"|› �}nb|| jkräd| j› d#| j› d$|› d"|
› d%|› �
}nI||	krûd| j› d&|	› d$|› d"|
› d%|› �
}n2|du �st |tƒ�sd| j› d'|› �}n|�sd| j› d(|› �}nt|ƒd)k�r-d| j› d*|› �}|�r5|  |¡‚z|�r<|}ntjjj||| j| j|d+�}|d |d< |W S  tjjj�yk } z	tt|ƒ|d,�|‚d}~w t�y� } zd-t|ƒv �rƒ| jt|ƒ|d,�‚| jt|ƒ|d,�‚d}~ww ).z5Verifies the signature and data for the provided JWT.ru   zIllegal z provided: z. z must be a non-empty string.zfFailed to ascertain project ID from the credential or the environment. Project ID is required to call z¦. Initialize the app with a credentials.Certificate or set your Firebase project ID as an app option. Alternatively set the GOOGLE_CLOUD_PROJECT environment variable.r   é<   z"Illegal clock_skew_seconds value: z&. Must be between 0 and 60, inclusive.r   r   r   zMake sure the z[ comes from the same Firebase project as the service account used to authenticate this SDK.zSee z  for details on how to retrieve rJ   Nz	 expects z, but was given a custom token.Zkidr,   ZHS256Úvr^   Údz&, but was given a legacy custom token.z	Firebase z has no "kid" claim.r   z4 has incorrect algorithm. Expected "RS256" but got "z". z1 has incorrect "aud" (audience) claim. Expected "z" but got "ú z/ has incorrect "iss" (issuer) claim. Expected "z has no "sub" (subject) claim. z, has an empty string "sub" (subject) claim. r]   z9 has a "sub" (subject) claim longer than 128 characters. )r4   ÚaudienceZ	certs_urlZclock_skew_in_seconds©ÚcausezToken expired)rM   rg   rl   ry   rU   r“   rD   r”   Ú_decode_unverifiedrR   r—   rG   r   rK   rj   r¯   re   r°   rN   rO   r�   Zverify_tokenr–   rm   r   rn   ÚCertificateFetchErrorr±   )r   Útokenr4   r§   r`   rr   r—   r¶   ÚsubjectZexpected_issuerZproject_id_match_msgZverify_id_token_msgZemulatedrp   Zverified_claimsr[   r   r   r   r¦   <  sÒ   ÿÿÿ
ÿ


ÿÿÿÿÿÿÿ
ÿÿÿ

ÿÿÿþÿ
ÿÿÿþÿÿ
ÿÿ
ÿÿ
û€€ýz_JWTVerifier.verifyc              
   C   sN   zt  |¡}t j|dd�}||fW S  ty& } z	| jt|ƒ|d�‚d }~ww )NF)r¦   r·   )r   Údecode_headerrW   rU   r°   rg   )r   r»   r`   rr   r[   r   r   r   r¹   ›  s   

€ÿz_JWTVerifier._decode_unverifiedNr¬   )r#   r$   r%   r:   r   r¦   r¹   r   r   r   r   rš   +  s
    
_rš   c                   @   ó   e Zd ZdZdd„ ZdS )ro   z7Unexpected error while signing a Firebase custom token.c                 C   ó   t j | ||¡ d S r   ©r   ÚUnknownErrorr   ©r   r!   r¸   r   r   r   r   §  ó   zTokenSignError.__init__N©r#   r$   r%   r:   r   r   r   r   r   ro   ¤  ó    ro   c                   @   r¾   )rº   zHFailed to fetch some public key certificates required to verify a token.c                 C   r¿   r   rÀ   rÂ   r   r   r   r   ®  rÃ   zCertificateFetchError.__init__NrÄ   r   r   r   r   rº   «  rÅ   rº   c                   @   r¾   )rž   z!The provided ID token is expired.c                 C   r¿   r   ©r   r�   r   rÂ   r   r   r   r   µ  rÃ   zExpiredIdTokenError.__init__NrÄ   r   r   r   r   rž   ²  rÅ   rž   c                   @   r¾   )ÚRevokedIdTokenErrorz'The provided ID token has been revoked.c                 C   s   t j | |¡ d S r   rÆ   r    r   r   r   r   ¼  r©   zRevokedIdTokenError.__init__NrÄ   r   r   r   r   rÇ   ¹  rÅ   rÇ   c                   @   s   e Zd ZdZddd„ZdS )r¢   z;The provided string is not a valid Firebase session cookie.Nc                 C   r¿   r   )r   ÚInvalidArgumentErrorr   rÂ   r   r   r   r   Ã  rÃ   z"InvalidSessionCookieError.__init__r   rÄ   r   r   r   r   r¢   À  s    r¢   c                   @   r¾   )r£   z'The provided session cookie is expired.c                 C   s   t  | ||¡ d S r   ©r¢   r   rÂ   r   r   r   r   Ê  r©   z"ExpiredSessionCookieError.__init__NrÄ   r   r   r   r   r£   Ç  rÅ   r£   c                   @   r¾   )ÚRevokedSessionCookieErrorz-The provided session cookie has been revoked.c                 C   s   t  | |¡ d S r   rÉ   r    r   r   r   r   Ñ  s   z"RevokedSessionCookieError.__init__NrÄ   r   r   r   r   rÊ   Î  rÅ   rÊ   )7r:   rz   ri   r…   rA   Zgoogle.authr   r   r   r   Zgoogle.auth.exceptionsrN   Zgoogle.oauth2.id_tokenZgoogle.oauth2.service_accountZfirebase_adminr   r   r   rœ   r›   r¡   r    rh   r{   r|   r~   r   rk   rj   rb   rd   rS   r;   r8   r7   rm   Zcryptr3   r   r&   r>   rB   r„   r’   rš   rÁ   ro   rº   r�   rž   rÇ   rÈ   r¢   r£   rÊ   r   r   r   r   Ú<module>   sT   
" 
y