1
+ from datetime import datetime , timedelta , timezone
1
2
from typing import Annotated
2
3
from fastapi import APIRouter , Depends
3
4
from pydantic import BaseModel
7
8
from passlib .context import CryptContext
8
9
from fastapi .security import OAuth2PasswordRequestForm
9
10
from starlette import status
11
+ from jose import jwt
10
12
11
13
router = APIRouter ()
12
14
15
+ SECRET_KEY = '9a929d8534c8b0d56a2a1954250a6c005a30bf29a77aff325cc164f7e23ce4ba'
16
+ ALGORITH = 'HS256'
17
+
13
18
bcrypt_context = CryptContext (schemes = ['bcrypt' ], deprecated = 'auto' )
14
19
15
20
@@ -22,6 +27,11 @@ class CreateUserRequest(BaseModel):
22
27
role : str
23
28
24
29
30
+ class Token (BaseModel ):
31
+ access_token : str
32
+ token_type : str
33
+
34
+
25
35
def get_db ():
26
36
db = SessionLocal ()
27
37
try :
@@ -39,7 +49,15 @@ def authenticate_user(username: str, password: str, db):
39
49
return False
40
50
if not bcrypt_context .verify (password , user .hashed_password ):
41
51
return False
42
- return True
52
+ return user
53
+
54
+
55
+ def create_access_token (username : str , user_id : int , expires_delta : timedelta ):
56
+ encode = {'sub' : username , 'id' : user_id }
57
+ expires = datetime .now (timezone .utc ) + expires_delta
58
+ encode .update ({'exp' : expires })
59
+ return jwt .encode (encode , SECRET_KEY , algorithm = ALGORITH )
60
+
43
61
44
62
@router .post ("/auth/" , status_code = status .HTTP_201_CREATED )
45
63
async def create_user (db : db_dependency ,
@@ -57,11 +75,12 @@ async def create_user(db: db_dependency,
57
75
db .commit ()
58
76
59
77
60
- @router .post ("/token" )
78
+ @router .post ("/token" , response_model = Token )
61
79
async def login_for_access_token (form_data : Annotated [OAuth2PasswordRequestForm , Depends ()],
62
80
db : db_dependency ):
63
81
user = authenticate_user (form_data .username , form_data .password , db )
64
- if not user :
82
+ if not user or user is False :
65
83
return "Failed Authentication"
66
- return "Successful Authentication"
84
+ token = create_access_token ( user . username , user . id , timedelta ( minutes = 20 ))
67
85
86
+ return {'access_token' : token , 'token_type' : 'bearer' }
0 commit comments