2222
2323class Token (BaseModel ):
2424 access_token : str
25+ refresh_token : str
2526 token_type : str
2627
2728
29+ class RefreshToken (BaseModel ):
30+ refresh_token : str
31+
32+
2833class TokenData (BaseModel ):
2934 username : Optional [str ] = None
3035
@@ -116,7 +121,20 @@ def create_access_token(
116121 expire = datetime .utcnow () + expires_delta
117122 else :
118123 expire = datetime .utcnow () + timedelta (minutes = 15 )
119- to_encode .update ({"exp" : expire })
124+ to_encode .update ({"exp" : expire , "scope" : "access_token" })
125+ encoded_jwt = jwt .encode (to_encode , SECRET_KEY , algorithm = ALGORITHM )
126+ return encoded_jwt
127+
128+
129+ def create_refresh_token (
130+ data : dict , expires_delta : Optional [timedelta ] = None
131+ ) -> str :
132+ to_encode = data .copy ()
133+ if expires_delta :
134+ expire = datetime .utcnow () + expires_delta
135+ else :
136+ expire = datetime .utcnow () + timedelta (minutes = 15 )
137+ to_encode .update ({"exp" : expire , "scope" : "refresh_token" })
120138 encoded_jwt = jwt .encode (to_encode , SECRET_KEY , algorithm = ALGORITHM )
121139 return encoded_jwt
122140
@@ -138,7 +156,7 @@ def get_user(username) -> Optional[User]:
138156
139157
140158def get_current_user (
141- token : str = Depends (oauth2_scheme ), request : Request = None
159+ token : str = Depends (oauth2_scheme ), request : Request = None , fresh = False
142160) -> User :
143161 credentials_exception = HTTPException (
144162 status_code = status .HTTP_401_UNAUTHORIZED ,
@@ -156,6 +174,7 @@ def get_current_user(
156174 try :
157175 payload = jwt .decode (token , SECRET_KEY , algorithms = [ALGORITHM ])
158176 username : str = payload .get ("sub" )
177+
159178 if username is None :
160179 raise credentials_exception
161180 token_data = TokenData (username = username )
@@ -164,6 +183,9 @@ def get_current_user(
164183 user = get_user (username = token_data .username )
165184 if user is None :
166185 raise credentials_exception
186+ if fresh and (not payload ["fresh" ] and not user .superuser ):
187+ raise credentials_exception
188+
167189 return user
168190
169191
@@ -178,6 +200,15 @@ async def get_current_active_user(
178200AuthenticatedUser = Depends (get_current_active_user )
179201
180202
203+ def get_current_fresh_user (
204+ token : str = Depends (oauth2_scheme ), request : Request = None
205+ ) -> User :
206+ return get_current_user (token , request , True )
207+
208+
209+ AuthenticatedFreshUser = Depends (get_current_fresh_user )
210+
211+
181212async def get_current_admin_user (
182213 current_user : User = Depends (get_current_user ),
183214) -> User :
@@ -189,3 +220,9 @@ async def get_current_admin_user(
189220
190221
191222AdminUser = Depends (get_current_admin_user )
223+
224+
225+ async def validate_token (token : str = Depends (oauth2_scheme )) -> User :
226+
227+ user = get_current_user (token = token )
228+ return user
0 commit comments