fix: align provider oauth refresh redirects

This commit is contained in:
fawney19
2026-04-27 22:08:02 +08:00
parent a7a3c9f023
commit ed17147281
6 changed files with 242 additions and 5 deletions

View File

@@ -21,12 +21,20 @@ pub(super) async fn execute_admin_provider_oauth_refresh(
key,
provider,
provider_type,
trace_id,
transport,
} = request;
let refreshed_entry = match state.force_local_oauth_refresh_entry(&transport).await {
Ok(Some(entry)) => Some(entry),
Ok(None) => {
tracing::warn!(
trace_id = %trace_id,
key_id = %key_id,
provider_id = %provider.id,
provider_type = %provider_type,
"gateway manual provider oauth refresh did not run"
);
return Ok(RefreshDispatch::Respond(response::control_error_response(
http::StatusCode::BAD_REQUEST,
"Token 刷新未执行,请检查授权配置",
@@ -41,6 +49,15 @@ pub(super) async fn execute_admin_provider_oauth_refresh(
Some(status_code),
Some(body_excerpt.as_str()),
);
tracing::warn!(
trace_id = %trace_id,
key_id = %key_id,
provider_id = %provider.id,
provider_type = %provider_type,
status_code,
reason = %error_reason,
"gateway manual provider oauth refresh failed"
);
if matches!(status_code, 400 | 401 | 403) {
let failure_reason = format!(
"{OAUTH_REFRESH_FAILED_PREFIX}Token 续期失败 ({status_code}): {error_reason}"
@@ -66,11 +83,27 @@ pub(super) async fn execute_admin_provider_oauth_refresh(
));
}
Err(AdminLocalOAuthRefreshError::Transport { source, .. }) => {
tracing::warn!(
trace_id = %trace_id,
key_id = %key_id,
provider_id = %provider.id,
provider_type = %provider_type,
error = %source,
"gateway manual provider oauth refresh transport failed"
);
return Ok(RefreshDispatch::Respond(
response::oauth_refresh_failed_service_unavailable_response(source.to_string()),
));
}
Err(AdminLocalOAuthRefreshError::InvalidResponse { message, .. }) => {
tracing::warn!(
trace_id = %trace_id,
key_id = %key_id,
provider_id = %provider.id,
provider_type = %provider_type,
reason = %message,
"gateway manual provider oauth refresh returned invalid response"
);
return Ok(RefreshDispatch::Respond(
response::oauth_refresh_failed_bad_request_response(&message),
));

View File

@@ -17,6 +17,7 @@ pub(super) struct RefreshRequestContext {
pub(super) key: StoredProviderCatalogKey,
pub(super) provider: StoredProviderCatalogProvider,
pub(super) provider_type: String,
pub(super) trace_id: String,
pub(super) transport: AdminGatewayProviderTransportSnapshot,
}

View File

@@ -101,6 +101,7 @@ pub(super) async fn parse_admin_provider_oauth_refresh_request(
key,
provider,
provider_type,
trace_id: request_context.trace_id().to_string(),
transport,
}))
}

View File

@@ -123,7 +123,14 @@ pub(crate) async fn create_provider_oauth_catalog_key(
record.circuit_breaker_by_format = Some(json!({}));
record.created_at_unix_ms = Some(now_unix_secs);
record.updated_at_unix_secs = Some(now_unix_secs);
state.create_provider_catalog_key(&record).await
let created = state.create_provider_catalog_key(&record).await?;
if let Some(key) = created.as_ref() {
let _ = state
.app()
.invalidate_local_oauth_refresh_entry(&key.id)
.await;
}
Ok(created)
}
pub(crate) async fn update_existing_provider_oauth_catalog_key(
@@ -166,7 +173,14 @@ pub(crate) async fn update_existing_provider_oauth_catalog_key(
updated.proxy = Some(proxy);
}
updated.updated_at_unix_secs = Some(now_unix_secs);
state.update_provider_catalog_key(&updated).await
let persisted = state.update_provider_catalog_key(&updated).await?;
if let Some(key) = persisted.as_ref() {
let _ = state
.app()
.invalidate_local_oauth_refresh_entry(&key.id)
.await;
}
Ok(persisted)
}
fn provider_oauth_catalog_key_api_formats(