60 lines
1.1 KiB
Python
60 lines
1.1 KiB
Python
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from core.security import verify_password
|
|
from core.jwt import create_access_token, create_refresh_token
|
|
|
|
from domains.users.repo import get_user_by_username
|
|
|
|
|
|
async def authenticate_user(
|
|
db: AsyncSession,
|
|
username: str,
|
|
secret: str
|
|
):
|
|
|
|
user = await get_user_by_username(db, username)
|
|
|
|
if not user:
|
|
return None
|
|
|
|
if not user.is_active:
|
|
return None
|
|
|
|
valid = verify_password(secret, user.secret_hash)
|
|
|
|
if not valid:
|
|
return None
|
|
|
|
return user
|
|
|
|
|
|
async def login_user(
|
|
db: AsyncSession,
|
|
username: str,
|
|
secret: str
|
|
):
|
|
|
|
user = await authenticate_user(
|
|
db,
|
|
username,
|
|
secret
|
|
)
|
|
|
|
if not user:
|
|
return None
|
|
|
|
token = create_access_token(
|
|
subject=str(user.id),
|
|
token_version=user.token_version
|
|
)
|
|
|
|
refresh_token = create_refresh_token(
|
|
subject=str(user.id),
|
|
token_version=user.token_version
|
|
)
|
|
|
|
return {
|
|
"access_token": token,
|
|
"refresh_token": refresh_token,
|
|
"token_type": "bearer"
|
|
} |