feat: émettrice SSO draco_session — cookie partagé .dracodev.net, renouvellement et révocation (#216)
This commit is contained in:
@@ -11,6 +11,7 @@ import re
|
||||
from fastapi import APIRouter, Body, Depends, HTTPException, Request, Response
|
||||
from pydantic import BaseModel, validator
|
||||
|
||||
from backend import draco_session
|
||||
from backend.ratelimit import is_account_rate_limited, is_rate_limited
|
||||
from backend.ratelimit import record_account_failure as rl_record_account_failure
|
||||
from backend.ratelimit import record_account_success as rl_record_account_success
|
||||
@@ -280,6 +281,11 @@ def _issue_tokens(user: dict, username: str, remember_me: bool, response: Respon
|
||||
secure=secure,
|
||||
path="/",
|
||||
)
|
||||
# Fusion ACC-3.1 (#216) : ObsiGate est l'émettrice SSO — chaque
|
||||
# émission de jetons natifs s'accompagne du cookie partagé
|
||||
# draco_session (inerte tant que DRACO_SESSION_SECRET n'est pas
|
||||
# configuré).
|
||||
draco_session.set_cookie(response, user, secure)
|
||||
return {
|
||||
"access_token": access_token,
|
||||
# OAuth2 token_type, pas un mot de passe (B105) :
|
||||
@@ -396,6 +402,19 @@ async def logout(
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Fusion ACC-3.1 (#216) : déconnexion globale — révoquer le jti du
|
||||
# cookie partagé et effacer le cookie sur le domaine parent.
|
||||
draco_tok = request.cookies.get(draco_session.COOKIE_NAME)
|
||||
if draco_tok:
|
||||
draco_claims = draco_session.decode_claims(draco_tok)
|
||||
if draco_claims and draco_claims.get("jti"):
|
||||
try:
|
||||
draco_session.revoke(str(draco_claims["jti"]),
|
||||
int(draco_claims.get("exp", 0)))
|
||||
except Exception:
|
||||
pass
|
||||
draco_session.clear_cookie(response)
|
||||
|
||||
response.delete_cookie("refresh_token", path="/api/auth/refresh")
|
||||
response.delete_cookie("access_token", path="/")
|
||||
response.delete_cookie("access_token", path="/api") # just in case
|
||||
|
||||
Reference in New Issue
Block a user