o
    h                     @   s   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d	ZG d
d dZdS )    )datetime	timedelta)DictOptional)DependsHTTPException)OAuth2PasswordBearer)jwtJWTError)settings)Anyz/FASTAPI/user/login)tokenUrlc                   @   s   e Zd ZdZeddeeef dee	 defddZ
eddeeef dee	 defdd	Zeeefd
edeeef fddZededeeef fddZdS )
JWTManagerz=Handles JWT access and refresh token creation and validation.Ndataexpires_deltareturnc                 C   \   |   }t |pttjd }||dd d|vs d|vr$tdtj	|tj
tjd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expire r(   9/var/www/html/beacon-api/app/dependency/authantication.pycreate_access_token      zJWTManager.create_access_tokenc                 C   r   )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%   r(   r(   r)   create_refresh_token   r+   zJWTManager.create_refresh_tokentokenc                 C   s   zF| s	t ddd|  } |  dr| dd } tj| tjtjgd}|	d}|d	kr4t dd
d|	dr>|	dsDt ddd|W S  t
yS   t ddd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
   )r0   payload
token_typer(   r(   r)   verify_tokenF   s    
zJWTManager.verify_tokenrefresh_tokenc                 C   s   z:t j| tjtjgd}|ddkrtddd|d}|d}|r'|s-tdd	dt||d
}|ddW S  t	yG   tdddw )z7Use a valid refresh token to create a new access token.r6   r   r-   r1   zInvalid refresh token typer2   r   r   z"Refresh token is missing user data)r   r   bearer)access_tokenr>   z Invalid or expired refresh token)
r	   r;   r   r#   r$   r<   r   r   r*   r
   )r@   r=   r   	user_namerB   r(   r(   r)   refresh_access_tokenb   s$   

zJWTManager.refresh_access_token)N)__name__
__module____qualname____doc__staticmethoddictstrr   r   r   r*   r   r/   r   oauth2_schemer?   rD   r(   r(   r(   r)   r      s    &&)$ r   N)r   r   typingr   r   fastapir   r   fastapi.securityr   joser	   r
   
app.configr   r   rL   r   r(   r(   r(   r)   <module>   s    
