
    @h                         d dl m Z mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ  e	d	      Z G d
 d      Zy)    )datetime	timedelta)DictOptional)DependsHTTPException)OAuth2PasswordBearer)jwtJWTError)settings)Anyz/FASTAPI/user/login)tokenUrlc                       e Zd ZdZeddeeef   dee	   defd       Z
eddeeef   dee	   defd       Ze ee      fdedeeef   fd	       Zed
edeeef   fd       Zy)
JWTManagerz=Handles JWT access and refresh token creation and validation.Ndataexpires_deltareturnc                 >   | j                         }t        j                         |xs t        t        j
                        z   }|j                  |dd       d|vsd|vrt        d      t        j                  |t        j                  t        j                        S )z$Generate a short-lived access token.)minutesaccessexptypeuser_idsub4Token must include both `user_id` and `sub` (email).	algorithm)copyr   utcnowr   r   ACCESS_TOKEN_EXPIRE_MINUTESupdate
ValueErrorr
   encode
SECRET_KEY	ALGORITHMr   r   	to_encodeexpires       9/var/www/html/beacon-api/app/dependency/authantication.pycreate_access_tokenzJWTManager.create_access_token   s     IIK	"TYx/S/ST
 	:;I%i)?STTzz)X%8%8HDVDVWW    c                 >   | j                         }t        j                         |xs t        t        j
                        z   }|j                  |dd       d|vsd|vrt        d      t        j                  |t        j                  t        j                        S )z$Generate a long-lived refresh token.)daysrefreshr   r   r   r   r   )r   r   r    r   r   REFRESH_TOKEN_EXPIRE_DAYSr"   r#   r
   r$   r%   r&   r'   s       r*   create_refresh_tokenzJWTManager.create_refresh_token   s     IIK	"OYH,N,NO
 	;<I%i)?STTzz)X%8%8HDVDVWWr,   tokenc                    	 | st        dd      | j                         } | j                         j                  d      r| dd } t	        j
                  | t        j                  t        j                  g      }|j                  d      }|d	k7  rt        dd
      |j                  d      r|j                  d      st        dd      |S # t        $ r t        dd      w xY w)z0Validate access token from Authorization header.  zMissing tokenstatus_codedetailzbearer    N
algorithmsr   r   z%Invalid token type for this operationr   r   z Invalid token: missing user datazInvalid or expired token)r   striplower
startswithr
   decoder   r%   r&   getr   )r2   payload
token_types      r*   verify_tokenzJWTManager.verify_token+   s    	T#OLLKKME{{}''	2ab	jj(;(;I[I[H\]G V,JX%#<cdd ;;y)U1C#<^__ N 	TC8RSS	Ts   CC C%refresh_tokenc                    	 t        j                  | t        j                  t        j                  g      }|j                  d      dk7  rt        dd      |j                  d      }|j                  d      }|r|st        dd	      t        j                  ||d
      }|ddS # t        $ r t        dd      w xY w)z7Use a valid refresh token to create a new access token.r9   r   r/   r4   zInvalid refresh token typer5   r   r   z"Refresh token is missing user data)r   r   bearer)access_tokenrA   z Invalid or expired refresh token)
r
   r>   r   r%   r&   r?   r   r   r+   r   )rC   r@   r   	user_namerF   s        r*   refresh_access_tokenzJWTManager.refresh_access_tokenG   s    	\jj0C0CQYQcQcPdeG{{6"i/#<XYYkk),GE*I)#<`aa &99" ; L !-& 
  	\C8Z[[	\s   B%B( (B?)N)__name__
__module____qualname____doc__staticmethoddictstrr   r   r   r+   r   r1   r   oauth2_schemerB   rH    r,   r*   r   r      s    GX$sCx. X)AT X`c X X X4S> X(9BU Xad X X ")-"8 TC TT#s(^ T T6 \C \DcN \ \r,   r   N)r   r   typingr   r   fastapir   r   fastapi.securityr	   joser
   r   
app.configr   r   rP   r   rQ   r,   r*   <module>rW      s3    ( ! * 1   $.CDV\ V\r,   