|
|
@@ -1,4 +1,4 @@
|
|
|
-from typing import Any, List
|
|
|
+from typing import Any, List, Optional
|
|
|
import logging
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
|
from sqlalchemy.orm import Session
|
|
|
@@ -14,10 +14,14 @@ router = APIRouter()
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@router.get("/login-request", summary="获取登录请求信息 (OIDC)")
|
|
|
-def get_login_request(challenge: str):
|
|
|
+def get_login_request(
|
|
|
+ challenge: str,
|
|
|
+ current_user: Optional[User] = Depends(deps.get_current_active_user_optional)
|
|
|
+):
|
|
|
"""
|
|
|
从 Hydra 获取登录请求信息。
|
|
|
前端调用此接口以检查是否应跳过登录(如果响应中 skip=true)。
|
|
|
+ 如果用户在统一认证平台已有会话,也会自动接受。
|
|
|
"""
|
|
|
try:
|
|
|
req = hydra_service.get_login_request(challenge)
|
|
|
@@ -25,6 +29,12 @@ def get_login_request(challenge: str):
|
|
|
logger.info(f"Skipping login for challenge {challenge}, subject: {req.subject}")
|
|
|
# If Hydra says skip, we just accept it immediately
|
|
|
return hydra_service.accept_login_request(challenge, subject=req.subject)
|
|
|
+
|
|
|
+ # 如果不是 skip,但用户在平台已登录,则自动接受
|
|
|
+ if current_user:
|
|
|
+ logger.info(f"Auto-accepting login for challenge {challenge}, using platform session, subject: {current_user.id}")
|
|
|
+ return hydra_service.accept_login_request(challenge, subject=str(current_user.id))
|
|
|
+
|
|
|
return req
|
|
|
except Exception as e:
|
|
|
logger.exception(f"Failed to get login request for challenge: {challenge}")
|
|
|
@@ -171,3 +181,29 @@ def reject_consent(
|
|
|
except Exception as e:
|
|
|
logger.exception(f"Failed to reject consent request for challenge: {challenge}")
|
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
+
|
|
|
+
|
|
|
+@router.get("/logout-request", summary="获取登出请求信息 (OIDC)")
|
|
|
+def get_logout_request(challenge: str):
|
|
|
+ """
|
|
|
+ 从 Hydra 获取登出请求信息。
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ return hydra_service.get_logout_request(challenge)
|
|
|
+ except Exception as e:
|
|
|
+ logger.exception(f"Failed to get logout request for challenge: {challenge}")
|
|
|
+ raise HTTPException(status_code=400, detail=str(e))
|
|
|
+
|
|
|
+@router.post("/logout/accept", summary="接受登出请求 (OIDC)")
|
|
|
+def accept_logout(
|
|
|
+ challenge: str
|
|
|
+):
|
|
|
+ """
|
|
|
+ 接受登出请求,返回 redirect_to。
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ logger.info(f"Accepting logout request for challenge: {challenge}")
|
|
|
+ return hydra_service.accept_logout_request(challenge)
|
|
|
+ except Exception as e:
|
|
|
+ logger.exception(f"Failed to accept logout request for challenge: {challenge}")
|
|
|
+ raise HTTPException(status_code=500, detail=str(e))
|