如何使用GCP应用默认凭据替代服务账户文件完成身份验证
用ADC替代服务账户JSON实现Rust从GCS下载文件
当前使用的cloud_storage_lite仅支持服务账户JSON文件认证,推荐改用官方维护的google-cloud-storage crate,它原生支持应用默认凭据(ADC),无需手动指定服务账户文件。
以下是修改后的完整代码:
use actix_web::{web, App, HttpResponse, HttpServer, Result, middleware}; use google_cloud_storage::{client::Client, http::objects::download::Range}; use env_logger::Env; use serde::{Deserialize, Serialize}; use serde_json::{Value, Map}; use std::error::Error; use std::sync::{Arc, RwLock}; use std::env; #[derive(Debug, Serialize, Deserialize)] struct RequestBody { instances: Vec<Instance>, } #[derive(Debug, Serialize, Deserialize)] struct Instance { _id: String, } #[derive(Serialize)] struct PredictionResult { predictions: Value, } async fn make_prediction( data: web::Data<Arc<RwLock<Map<String, Value>>>>, body: web::Json<RequestBody>, ) -> Result<HttpResponse> { let map = data.read().unwrap(); let mut prediction = Value::Null; for instance in &body.instances { prediction = map.get(&instance._id) .cloned() .unwrap_or_else(|| Value::String(format!("error: user not found: {}", instance._id))); } Ok(HttpResponse::Ok().json(PredictionResult { predictions: prediction })) } pub struct JsonParser; impl JsonParser { pub async fn read_json_from_gcs() -> Result<Map<String, Value>, Box<dyn Error + Send + Sync>> { // 初始化GCS客户端,自动使用ADC let client = Client::default().await?; let bucket = "bucket-name"; let object_path = "**/predictions.json"; // 下载文件内容 let content = client.download_object(bucket, object_path, &Range::default()).await?; let data = String::from_utf8(content)?; let parsed: Value = serde_json::from_str(&data)?; let obj: Map<String, Value> = parsed.as_object().unwrap().clone(); Ok(obj) } } async fn health_check() -> Result<HttpResponse> { Ok(HttpResponse::Ok().finish()) } #[actix_web::main] async fn main() -> std::io::Result<()> { dotenv::dotenv().ok(); env_logger::from_env(Env::default().default_filter_or("info")).init(); let hash_map = JsonParser::read_json_from_gcs().await.unwrap(); let data = Arc::new(RwLock::new(hash_map)); HttpServer::new(move || { App::new() .wrap(middleware::Logger::default()) .app_data(web::Data::new(Arc::clone(&data))) .app_data(web::JsonConfig::default().limit(4096)) .route("/predict", web::post().to(make_prediction)) .route("/health_check", web::get().to(health_check)) }) .bind("0.0.0.0:8080")? .run() .await }
关键说明:
google-cloud-storage客户端初始化时会自动触发ADC逻辑:- 本地开发环境:优先读取
gcloud auth application-default login生成的凭据文件 - GCP服务环境(GCE/GKE/Cloud Run等):自动从元数据服务器获取临时凭据
- 环境变量:如果设置了
GOOGLE_APPLICATION_CREDENTIALS,会读取指定的服务账户文件
- 本地开发环境:优先读取
- 移除了原代码中手动构建令牌提供者的逻辑,简化了认证流程
使用前准备:
- 在
Cargo.toml中添加依赖:
[dependencies] google-cloud-storage = "0.12" # 保留原有的actix-web、serde等依赖
- 本地开发时,执行
gcloud auth application-default login完成凭据配置
内容的提问来源于stack exchange,提问作者MPA
相关产品推荐
相关产品推荐

