-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauth.py
69 lines (53 loc) · 1.97 KB
/
auth.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import logging
from datetime import datetime, timedelta, timezone
import jwt
from fastapi import HTTPException, Request, Response
from passlib.context import CryptContext
from starlette.status import HTTP_403_FORBIDDEN
from src import settings
logger = logging.getLogger("bakery")
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def verify_password(plain_password: str, hashed_password: str) -> bool:
return pwd_context.verify(plain_password, hashed_password)
def set_cookie(response: Response, username: str):
created_at = datetime.now(timezone.utc)
expires_at = created_at + timedelta(minutes=settings.COOKIE_MAX_AGE_MINUTES)
token = create_token(username, created_at, expires_at)
response.set_cookie(
"token",
token,
max_age=settings.COOKIE_MAX_AGE_MINUTES * 60,
httponly=True,
samesite="strict",
)
return response
def remove_cookie(response: Response):
response.set_cookie("token", "", max_age=0)
return response
def verify_cookie(request: Request) -> dict:
token = request.cookies.get("token")
if token is None:
raise HTTPException(HTTP_403_FORBIDDEN, "Not authenticated")
try:
return decode_token(token)
except jwt.PyJWTError:
raise HTTPException(HTTP_403_FORBIDDEN, "Credentials invalid or expired")
def create_token(username: str, created_at: datetime, expires_at: datetime) -> str:
payload = {
"sub": username,
"iat": created_at,
"exp": expires_at,
}
return jwt.encode(payload, settings.COOKIE_SECRET, algorithm="HS256")
def decode_token(token: str) -> dict:
payload = jwt.decode(
token,
settings.COOKIE_SECRET,
algorithms=["HS256"],
options={"require": ["sub", "iat", "exp"]},
)
return {
"username": payload["sub"],
"created_at": datetime.fromtimestamp(payload["iat"], timezone.utc),
"expires_at": datetime.fromtimestamp(payload["exp"], timezone.utc),
}