mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
fix(kiro): 修复测试模型时 403 bearer token invalid 错误
问题: Kiro 测试模型时返回 403,原因是 get_provider_auth() 直接使用 key.api_key 作为 access_token,但新导入的 key 其 api_key 是占位符,且当 expires_at 未设置时不会触发刷新。 修复: 1. 如果没有缓存的 access_token 或 api_key 是占位符,强制刷新 2. Kiro 类型优先使用 auth_config 中缓存的 access_token
This commit is contained in:
@@ -1032,6 +1032,7 @@ async def get_provider_auth(
|
|||||||
expires_at = token_meta.get("expires_at")
|
expires_at = token_meta.get("expires_at")
|
||||||
refresh_token = token_meta.get("refresh_token")
|
refresh_token = token_meta.get("refresh_token")
|
||||||
provider_type = str(token_meta.get("provider_type") or "")
|
provider_type = str(token_meta.get("provider_type") or "")
|
||||||
|
cached_access_token = str(token_meta.get("access_token") or "").strip()
|
||||||
|
|
||||||
# 120s skew (or force refresh when upstream returns 401)
|
# 120s skew (or force refresh when upstream returns 401)
|
||||||
should_refresh = False
|
should_refresh = False
|
||||||
@@ -1044,6 +1045,12 @@ async def get_provider_auth(
|
|||||||
if force_refresh:
|
if force_refresh:
|
||||||
should_refresh = True
|
should_refresh = True
|
||||||
|
|
||||||
|
# Kiro 特殊处理:如果没有缓存的 access_token 或 key.api_key 是占位符,强制刷新
|
||||||
|
if provider_type == "kiro" and not should_refresh:
|
||||||
|
decrypted_api_key = crypto_service.decrypt(key.api_key)
|
||||||
|
if not cached_access_token or decrypted_api_key == "__placeholder__":
|
||||||
|
should_refresh = True
|
||||||
|
|
||||||
if should_refresh and refresh_token and provider_type:
|
if should_refresh and refresh_token and provider_type:
|
||||||
try:
|
try:
|
||||||
from src.core.provider_templates.fixed_providers import FIXED_PROVIDERS
|
from src.core.provider_templates.fixed_providers import FIXED_PROVIDERS
|
||||||
@@ -1070,7 +1077,18 @@ async def get_provider_auth(
|
|||||||
# 刷新失败不阻断请求;后续由上游返回 401 再触发管理端处理
|
# 刷新失败不阻断请求;后续由上游返回 401 再触发管理端处理
|
||||||
pass
|
pass
|
||||||
|
|
||||||
decrypted_key = crypto_service.decrypt(key.api_key)
|
# 获取最终使用的 access_token
|
||||||
|
# Kiro 优先使用 token_meta 中缓存的 access_token(刷新后会更新到 token_meta)
|
||||||
|
effective_access_token: str
|
||||||
|
if provider_type == "kiro":
|
||||||
|
# Kiro: 优先使用 token_meta 中的 access_token,回退到 key.api_key
|
||||||
|
cached_token = str(token_meta.get("access_token") or "").strip()
|
||||||
|
if cached_token:
|
||||||
|
effective_access_token = cached_token
|
||||||
|
else:
|
||||||
|
effective_access_token = crypto_service.decrypt(key.api_key)
|
||||||
|
else:
|
||||||
|
effective_access_token = crypto_service.decrypt(key.api_key)
|
||||||
|
|
||||||
decrypted_auth_config: dict[str, Any] | None = None
|
decrypted_auth_config: dict[str, Any] | None = None
|
||||||
if isinstance(token_meta, dict) and token_meta:
|
if isinstance(token_meta, dict) and token_meta:
|
||||||
@@ -1078,7 +1096,7 @@ async def get_provider_auth(
|
|||||||
|
|
||||||
return ProviderAuthInfo(
|
return ProviderAuthInfo(
|
||||||
auth_header="Authorization",
|
auth_header="Authorization",
|
||||||
auth_value=f"Bearer {decrypted_key}",
|
auth_value=f"Bearer {effective_access_token}",
|
||||||
decrypted_auth_config=decrypted_auth_config,
|
decrypted_auth_config=decrypted_auth_config,
|
||||||
)
|
)
|
||||||
if auth_type == "vertex_ai":
|
if auth_type == "vertex_ai":
|
||||||
|
|||||||
Reference in New Issue
Block a user