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

如何从独立Firebase项目的Web应用访问受IAP保护的App Engine API?

跨GCP项目:Firebase托管应用通过服务账号访问IAP保护的App Engine API

可以用服务账号以编程方式实现认证,但要注意不能直接在前端代码中使用服务账号密钥(会泄露敏感信息),必须通过后端中间层(比如Firebase Cloud Functions)处理认证逻辑,具体步骤如下:

1. 配置App Engine项目的服务账号

  • 在App Engine API所在的GCP项目中创建服务账号,为其分配IAP-secured Web App User角色,确保该账号拥有访问受IAP保护资源的权限。
  • 下载该服务账号的JSON密钥文件,妥善存储(不要提交到代码仓库或暴露给前端)。

2. 搭建Firebase Cloud Functions中间层

在Firebase项目中创建Cloud Functions,用于处理服务账号认证和请求转发:

  • 安装依赖:npm install google-auth-library
  • 编写函数逻辑,核心代码示例:
const { GoogleAuth } = require('google-auth-library');
const functions = require('firebase-functions');
const axios = require('axios');

// 从环境变量加载服务账号密钥和IAP客户端ID
const SERVICE_ACCOUNT_KEY = JSON.parse(process.env.SERVICE_ACCOUNT_KEY);
const IAP_CLIENT_ID = process.env.IAP_CLIENT_ID;
const APP_ENGINE_API_URL = process.env.APP_ENGINE_API_URL;

exports.callIAPProtectedAPI = functions.https.onCall(async (data, context) => {
  // 可选:验证前端用户的Firebase Auth身份
  if (!context.auth) {
    throw new functions.https.HttpsError('unauthenticated', '用户未登录');
  }

  // 生成IAP访问令牌
  const auth = new GoogleAuth({
    credentials: SERVICE_ACCOUNT_KEY,
    scopes: ['https://www.googleapis.com/auth/cloud-platform']
  });
  const client = await auth.getIdTokenClient(IAP_CLIENT_ID);
  const idToken = await client.idTokenProvider.fetchIdToken(IAP_CLIENT_ID);

  // 转发请求到App Engine API
  try {
    const response = await axios({
      method: data.method || 'GET',
      url: APP_ENGINE_API_URL + data.path,
      headers: {
        'Authorization': `Bearer ${idToken}`
      },
      data: data.body
    });
    return response.data;
  } catch (error) {
    throw new functions.https.HttpsError('internal', 'API请求失败', error.response?.data);
  }
});
  • 将服务账号密钥、IAP客户端ID、App Engine API地址配置为Firebase环境变量:
firebase functions:config:set service.account.key="$(cat path/to/service-account-key.json)" iap.client.id="your-iap-client-id" app.engine.api.url="https://your-app-engine-api.com"

3. 前端调用中间层

在Angular应用中,通过Firebase Functions SDK调用上述Cloud Functions,无需直接处理IAP认证:

import { Functions, httpsCallable } from '@angular/fire/functions';

// 初始化Functions
constructor(private functions: Functions) {}

// 调用API
async callAPI() {
  const callIAPAPI = httpsCallable(this.functions, 'callIAPProtectedAPI');
  try {
    const result = await callIAPAPI({
      method: 'GET',
      path: '/api/your-endpoint',
      body: {} // 可选请求体
    });
    console.log(result.data);
  } catch (error) {
    console.error('请求失败:', error);
  }
}

关键注意事项

  • 跨项目权限:确保App Engine项目的IAP设置中,已将创建的服务账号添加到允许访问的列表中。
  • 安全风险:绝对不能在前端代码中嵌入服务账号密钥,否则会导致密钥泄露,引发安全问题。
  • 用户身份验证:可选在Cloud Functions中验证前端用户的Firebase Auth身份,确保只有合法用户能触发API请求。

你遇到的401 Unauthorized: Invalid IAP credentials: empty token错误,是因为前端直接发送的请求未携带IAP认可的有效令牌——Firebase Auth的令牌无法直接用于IAP认证,必须通过上述服务账号生成的专用令牌。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:01:51