Skip to content

Commit e7423d8

Browse files
committed
Encode response with JWT
1 parent 7a7ab6c commit e7423d8

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

ToDoApp/routers/auth.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime, timedelta, timezone
12
from typing import Annotated
23
from fastapi import APIRouter, Depends
34
from pydantic import BaseModel
@@ -7,9 +8,13 @@
78
from passlib.context import CryptContext
89
from fastapi.security import OAuth2PasswordRequestForm
910
from starlette import status
11+
from jose import jwt
1012

1113
router = APIRouter()
1214

15+
SECRET_KEY = '9a929d8534c8b0d56a2a1954250a6c005a30bf29a77aff325cc164f7e23ce4ba'
16+
ALGORITH = 'HS256'
17+
1318
bcrypt_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
1419

1520

@@ -22,6 +27,11 @@ class CreateUserRequest(BaseModel):
2227
role: str
2328

2429

30+
class Token(BaseModel):
31+
access_token: str
32+
token_type: str
33+
34+
2535
def get_db():
2636
db = SessionLocal()
2737
try:
@@ -39,7 +49,15 @@ def authenticate_user(username: str, password: str, db):
3949
return False
4050
if not bcrypt_context.verify(password, user.hashed_password):
4151
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+
4361

4462
@router.post("/auth/", status_code=status.HTTP_201_CREATED)
4563
async def create_user(db: db_dependency,
@@ -57,11 +75,12 @@ async def create_user(db: db_dependency,
5775
db.commit()
5876

5977

60-
@router.post("/token")
78+
@router.post("/token", response_model=Token)
6179
async def login_for_access_token(form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
6280
db: db_dependency):
6381
user = authenticate_user(form_data.username, form_data.password, db)
64-
if not user:
82+
if not user or user is False:
6583
return "Failed Authentication"
66-
return "Successful Authentication"
84+
token = create_access_token(user.username, user.id, timedelta(minutes=20))
6785

86+
return {'access_token': token, 'token_type': 'bearer'}

0 commit comments

Comments
 (0)