|
@@ -92,17 +92,31 @@ class AuthMiddleware(BaseHTTPMiddleware):
|
|
|
# 2. 缓存未命中,调 SSO profile 验证(含角色信息)
|
|
# 2. 缓存未命中,调 SSO profile 验证(含角色信息)
|
|
|
user_info = await OAuthService.verify_sso_token(sso_token)
|
|
user_info = await OAuthService.verify_sso_token(sso_token)
|
|
|
|
|
|
|
|
- # 3. 同步用户到本地数据库(更新角色)
|
|
|
|
|
|
|
+ # 3. 同步用户到本地数据库(更新角色),获取本地用户ID
|
|
|
try:
|
|
try:
|
|
|
- OAuthService.sync_user_from_oauth(user_info)
|
|
|
|
|
|
|
+ local_user = OAuthService.sync_user_from_oauth(oauth_user_info=user_info)
|
|
|
|
|
+ # 将本地user.id也存入user_info,供后续使用
|
|
|
|
|
+ user_info["local_user_id"] = local_user.id
|
|
|
except Exception as sync_err:
|
|
except Exception as sync_err:
|
|
|
logger.warning(f"用户同步失败(不影响认证): {sync_err}")
|
|
logger.warning(f"用户同步失败(不影响认证): {sync_err}")
|
|
|
|
|
|
|
|
# 4. 写入缓存
|
|
# 4. 写入缓存
|
|
|
token_cache.set(sso_token, user_info)
|
|
token_cache.set(sso_token, user_info)
|
|
|
|
|
|
|
|
- # 提取用户信息
|
|
|
|
|
- user_id = user_info.get("id") or user_info.get("sub")
|
|
|
|
|
|
|
+ # 提取用户信息,优先使用本地用户ID
|
|
|
|
|
+ # 如果缓存中没有 local_user_id,则重新同步用户
|
|
|
|
|
+ local_user_id = user_info.get("local_user_id")
|
|
|
|
|
+ if not local_user_id:
|
|
|
|
|
+ try:
|
|
|
|
|
+ local_user = OAuthService.sync_user_from_oauth(oauth_user_info=user_info)
|
|
|
|
|
+ local_user_id = local_user.id
|
|
|
|
|
+ # 更新缓存,避免下次重复同步
|
|
|
|
|
+ user_info["local_user_id"] = local_user_id
|
|
|
|
|
+ token_cache.set(sso_token, user_info)
|
|
|
|
|
+ except Exception as sync_err:
|
|
|
|
|
+ logger.warning(f"重新同步用户失败,使用SSO ID: {sync_err}")
|
|
|
|
|
+
|
|
|
|
|
+ user_id = local_user_id or user_info.get("id") or user_info.get("sub")
|
|
|
username = (
|
|
username = (
|
|
|
user_info.get("username")
|
|
user_info.get("username")
|
|
|
or user_info.get("preferred_username")
|
|
or user_info.get("preferred_username")
|