U
    cc                     @   s   d dl mZ d dlmZ d dlmZmZ ddlm	Z	m
Z
mZ ddlmZ ejZeejeefsdefZdd eD ZG d	d
 d
ejZG dd deZeZdd ZdS )    )get_user_model)gettext_lazy)HTTP_HEADER_ENCODINGauthentication   )AuthenticationFailedInvalidToken
TokenError)api_settingsc                 C   s   h | ]}| tqS  )encoder   ).0hr   r   a/var/www/html/project/venv/lib/python3.8/site-packages/rest_framework_simplejwt/authentication.py	<setcomp>   s     r   c                       sX   e Zd ZdZdZdZ fddZdd Zdd	 Zd
d Z	dd Z
dd Zdd Z  ZS )JWTAuthenticationzy
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header.
    apizapplication/jsonc                    s   t  j|| t | _d S N)super__init__r   
user_model)selfargskwargs	__class__r   r   r      s    zJWTAuthentication.__init__c                 C   sD   |  |}|d krd S | |}|d kr,d S | |}| ||fS r   )
get_headerget_raw_tokenget_validated_tokenget_user)r   requestheader	raw_tokenvalidated_tokenr   r   r   authenticate   s    


zJWTAuthentication.authenticatec                 C   s   d td | jS )Nz{} realm="{}"r   )formatAUTH_HEADER_TYPESwww_authenticate_realm)r   r    r   r   r   authenticate_header*   s    z%JWTAuthentication.authenticate_headerc                 C   s&   |j tj}t|tr"|t}|S )zc
        Extracts the header containing the JSON web token from the given
        request.
        )ZMETAgetr
   ZAUTH_HEADER_NAME
isinstancestrr   r   )r   r    r!   r   r   r   r   0   s    

zJWTAuthentication.get_headerc                 C   sL   |  }t|dkrdS |d tkr(dS t|dkrDttddd|d S )zm
        Extracts an unvalidated JSON web token from the given "Authorization"
        header value.
        r   N   z<Authorization header must contain two space-delimited valuesZbad_authorization_headercoder   )splitlenAUTH_HEADER_TYPE_BYTESr   _)r   r!   partsr   r   r   r   =   s    zJWTAuthentication.get_raw_tokenc                 C   st   g }t jD ]R}z||W   S  tk
rZ } z ||j|j|jd d W 5 d}~X Y q
X q
ttd|ddS )zk
        Validates an encoded JSON web token and returns a validated token
        wrapper object.
        r   )Ztoken_class
token_typemessageNz(Given token not valid for any token type)detailmessages)	r
   ZAUTH_TOKEN_CLASSESr	   append__name__r4   r   r   r2   )r   r"   r7   Z	AuthTokener   r   r   r   T   s     
z%JWTAuthentication.get_validated_tokenc                 C   s   z|t j }W n  tk
r.   ttdY nX z| jjjf t j|i}W n( | jj	k
rr   t
tdddY nX |jst
tddd|S )zU
        Attempts to find and return a user using the given validated token.
        3Token contained no recognizable user identificationzUser not foundZuser_not_foundr-   zUser is inactiveZuser_inactive)r
   USER_ID_CLAIMKeyErrorr   r2   r   objectsr)   ZUSER_ID_FIELDZDoesNotExistr   	is_active)r   r#   Zuser_iduserr   r   r   r   m   s    zJWTAuthentication.get_user)r9   
__module____qualname____doc__r'   
media_typer   r$   r(   r   r   r   r   __classcell__r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )JWTStatelessUserAuthenticationz
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header without performing a database lookup to obtain a user instance.
    c                 C   s    t j|krttdt |S )zg
        Returns a stateless user object which is backed by the given validated
        token.
        r;   )r
   r<   r   r2   ZTOKEN_USER_CLASS)r   r#   r   r   r   r      s    
z'JWTStatelessUserAuthentication.get_userN)r9   rA   rB   rC   r   r   r   r   r   rF      s   rF   c                 C   s   | d k	o| j S r   )r?   )r@   r   r   r    default_user_authentication_rule   s    rG   N)Zdjango.contrib.authr   Zdjango.utils.translationr   r2   Zrest_frameworkr   r   
exceptionsr   r   r	   settingsr
   r&   r*   listtupler1   ZBaseAuthenticationr   rF   ZJWTTokenUserAuthenticationrG   r   r   r   r   <module>   s   q