71 lines
2.7 KiB
Python
71 lines
2.7 KiB
Python
import re
|
|
|
|
with open("/opt/docker/dev/service_finder/backend/app/api/v1/endpoints/auth.py", "r") as f:
|
|
content = f.read()
|
|
|
|
# Add Response to imports if not there
|
|
if "from fastapi import APIRouter, Depends, HTTPException, status, Request, Form, Response" not in content:
|
|
content = content.replace(
|
|
"from fastapi import APIRouter, Depends, HTTPException, status, Request, Form",
|
|
"from fastapi import APIRouter, Depends, HTTPException, status, Request, Form, Response"
|
|
)
|
|
|
|
new_login = """
|
|
@router.post("/login", response_model=Token)
|
|
async def login(
|
|
response: Response,
|
|
db: AsyncSession = Depends(get_db),
|
|
form_data: OAuth2PasswordRequestForm = Depends(),
|
|
remember_me: bool = Form(False)
|
|
):
|
|
\"\"\"
|
|
Bejelentkezés remember_me opcióval.
|
|
|
|
A remember_me paramétert explicit Form mezőként kell elküldeni, mivel az
|
|
OAuth2PasswordRequestForm nem támogatja alapból.
|
|
\"\"\"
|
|
user = await AuthService.authenticate(db, form_data.username, form_data.password)
|
|
if not user:
|
|
raise HTTPException(status_code=401, detail="Hibás adatok.")
|
|
|
|
ranks = await settings.get_db_setting(db, "rbac_rank_matrix", default=DEFAULT_RANK_MAP)
|
|
role_name = user.role.value if hasattr(user.role, 'value') else str(user.role)
|
|
role_key = role_name.upper() # A DEFAULT_RANK_MAP nagybetűs kulcsokat vár
|
|
|
|
token_data = {
|
|
"sub": str(user.id),
|
|
"role": role_name,
|
|
"rank": ranks.get(role_key, 10),
|
|
"scope_level": user.scope_level or "individual",
|
|
"scope_id": str(user.scope_id) if user.scope_id else str(user.id)
|
|
}
|
|
|
|
access, refresh = create_tokens(data=token_data, remember_me=remember_me)
|
|
|
|
# Kinyerjük a beállításokból, hogy meddig él a refresh token (itt is, vagy a create_tokens is ezt csinálja)
|
|
# A SSoT szerint auth_remember_me_days = 30
|
|
if remember_me:
|
|
max_age_days = await config.get_setting(db, "auth_remember_me_days", default=30)
|
|
else:
|
|
max_age_days = await config.get_setting(db, "auth_refresh_default_days", default=1)
|
|
|
|
max_age_sec = int(max_age_days) * 24 * 60 * 60
|
|
|
|
response.set_cookie(
|
|
key="refresh_token",
|
|
value=refresh,
|
|
httponly=True,
|
|
secure=True, # Use Secure
|
|
samesite="lax",
|
|
max_age=max_age_sec
|
|
)
|
|
|
|
return {"access_token": access, "refresh_token": refresh, "token_type": "bearer", "is_active": user.is_active}
|
|
"""
|
|
|
|
pattern = r'@router\.post\("/login", response_model=Token\)\nasync def login\(.*?\):\n(?:.*?(?=@router\.post|class VerifyEmailRequest))'
|
|
content = re.sub(pattern, new_login.strip() + "\n\n", content, flags=re.DOTALL)
|
|
|
|
with open("/opt/docker/dev/service_finder/backend/app/api/v1/endpoints/auth.py", "w") as f:
|
|
f.write(content)
|