修复 Vertex AI 服务账号访问

This commit is contained in:
Codex
2026-05-10 15:51:38 +08:00
parent 7f101431c5
commit 7e804c408f
20 changed files with 851 additions and 42 deletions

View File

@@ -8,6 +8,7 @@ use aether_provider_transport::{
};
use base64::engine::general_purpose::{STANDARD, URL_SAFE_NO_PAD};
use base64::Engine as _;
use rsa::pkcs1::DecodeRsaPrivateKey;
use rsa::pkcs1v15::SigningKey;
use rsa::pkcs8::DecodePrivateKey;
use rsa::signature::{SignatureEncoding, Signer};
@@ -675,8 +676,7 @@ fn build_vertex_service_account_assertion(
.map_err(|err| format!("vertex_ai(service_account): jwt payload encode failed: {err}"))?,
);
let message = format!("{header}.{payload}");
let private_key = RsaPrivateKey::from_pkcs8_pem(private_key_pem)
.map_err(|err| format!("vertex_ai(service_account): private_key parse failed: {err}"))?;
let private_key = decode_vertex_service_account_private_key(private_key_pem)?;
let signing_key = SigningKey::<Sha256>::new(private_key);
let signature = signing_key.sign(message.as_bytes());
Ok(format!(
@@ -685,6 +685,19 @@ fn build_vertex_service_account_assertion(
))
}
fn decode_vertex_service_account_private_key(
private_key_pem: &str,
) -> Result<RsaPrivateKey, String> {
match RsaPrivateKey::from_pkcs8_pem(private_key_pem) {
Ok(private_key) => Ok(private_key),
Err(pkcs8_err) => RsaPrivateKey::from_pkcs1_pem(private_key_pem).map_err(|pkcs1_err| {
format!(
"vertex_ai(service_account): private_key parse failed: pkcs8: {pkcs8_err}; pkcs1: {pkcs1_err}"
)
}),
}
}
fn execution_result_json_body(result: &ExecutionResult) -> Result<Value, String> {
if result.status_code != 200 {
return Err(execution_result_error_message(result));