You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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逻辑:
    1. 本地开发环境:优先读取gcloud auth application-default login生成的凭据文件
    2. GCP服务环境(GCE/GKE/Cloud Run等):自动从元数据服务器获取临时凭据
    3. 环境变量:如果设置了GOOGLE_APPLICATION_CREDENTIALS,会读取指定的服务账户文件
  • 移除了原代码中手动构建令牌提供者的逻辑,简化了认证流程

使用前准备:

  1. 在Cargo.toml中添加依赖:
[dependencies]
google-cloud-storage = "0.12"
# 保留原有的actix-web、serde等依赖
  1. 本地开发时,执行gcloud auth application-default login完成凭据配置

内容的提问来源于stack exchange,提问作者MPA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:07:51