auth: issue RS256 session cookies when OIDC key is configured
Login endpoint switches from HS256 JWT to RS256 id_token (aud="bincio", 30-day TTL) when oidc_private_key_pem is set. Existing HS256 sessions remain valid on bincio-activity until they naturally expire.
This commit is contained in:
+7
-2
@@ -68,7 +68,12 @@ def _issue_jwt(user: User) -> str:
|
|||||||
_ID_TOKEN_TTL = 3600 # 1 hour — short-lived; clients use refresh or re-auth
|
_ID_TOKEN_TTL = 3600 # 1 hour — short-lived; clients use refresh or re-auth
|
||||||
|
|
||||||
|
|
||||||
def _issue_id_token(user: User, client_id: str, nonce: str | None = None) -> str:
|
def _issue_id_token(
|
||||||
|
user: User,
|
||||||
|
client_id: str,
|
||||||
|
nonce: str | None = None,
|
||||||
|
ttl: int | None = None,
|
||||||
|
) -> str:
|
||||||
"""Issue an RS256 OIDC id_token for the given user and client."""
|
"""Issue an RS256 OIDC id_token for the given user and client."""
|
||||||
claims: dict = {
|
claims: dict = {
|
||||||
"iss": oidc_issuer,
|
"iss": oidc_issuer,
|
||||||
@@ -83,7 +88,7 @@ def _issue_id_token(user: User, client_id: str, nonce: str | None = None) -> str
|
|||||||
}
|
}
|
||||||
if nonce:
|
if nonce:
|
||||||
claims["nonce"] = nonce
|
claims["nonce"] = nonce
|
||||||
return create_id_token(claims, oidc_private_key_pem, _ID_TOKEN_TTL)
|
return create_id_token(claims, oidc_private_key_pem, ttl if ttl is not None else _ID_TOKEN_TTL)
|
||||||
|
|
||||||
|
|
||||||
# ── Rate limiting ─────────────────────────────────────────────────────────────
|
# ── Rate limiting ─────────────────────────────────────────────────────────────
|
||||||
|
|||||||
@@ -40,7 +40,10 @@ async def login(body: LoginRequest, request: Request) -> JSONResponse:
|
|||||||
if not user:
|
if not user:
|
||||||
raise HTTPException(401, "Invalid credentials")
|
raise HTTPException(401, "Invalid credentials")
|
||||||
|
|
||||||
token = deps._issue_jwt(user)
|
if deps.oidc_private_key_pem:
|
||||||
|
token = deps._issue_id_token(user, client_id="bincio", ttl=deps._JWT_TTL)
|
||||||
|
else:
|
||||||
|
token = deps._issue_jwt(user)
|
||||||
resp = JSONResponse({
|
resp = JSONResponse({
|
||||||
"ok": True,
|
"ok": True,
|
||||||
"handle": user.handle,
|
"handle": user.handle,
|
||||||
|
|||||||
Reference in New Issue
Block a user