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

如何用免费Firebase Auth限制AWS无Lambda的API Gateway+DynamoDB接口访问?

没问题,这个需求完全可以实现——虽然你的核心API是无Lambda直接对接DynamoDB,但只需要加一个超轻量的Lambda自定义授权器(几乎零成本),就能用Firebase Auth来做身份校验,下面是一步一步的实现方案:

用Firebase Auth保护AWS API Gateway + DynamoDB无Lambda API

首先明确:这个方案里的Lambda只是做Token验证的轻量逻辑,AWS Lambda有免费额度,小流量场景下几乎不会产生费用,完全符合你的成本预期。

1. 准备Firebase Auth基础配置

  • 从Firebase项目控制台导出服务账号密钥(JSON格式),同时记下你的项目ID和Auth域名。
  • 确保你的Web应用已经集成Firebase Auth,前端登录后可以通过firebase.auth().currentUser.getIdToken()获取有效的ID Token。

2. 创建Lambda自定义授权器

这个Lambda的唯一作用就是验证请求头里的Firebase ID Token是否合法,代码逻辑非常简单:

const admin = require('firebase-admin');
// 初始化Firebase Admin SDK(建议用AWS Secrets Manager存储密钥,这里为了示例直接引入)
admin.initializeApp({
  credential: admin.credential.cert(require('./your-firebase-service-account.json'))
});

exports.handler = async (event) => {
  // 提取请求头里的Authorization字段,格式应为"Bearer <ID_TOKEN>"
  const authHeader = event.authorizationToken;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return generatePolicy('unauthorized', 'Deny', event.methodArn);
  }
  
  const idToken = authHeader.split(' ')[1];
  try {
    // 验证Firebase ID Token的合法性
    const decodedToken = await admin.auth().verifyIdToken(idToken);
    // 验证通过,返回允许访问的策略文档
    return generatePolicy(decodedToken.uid, 'Allow', event.methodArn);
  } catch (error) {
    // Token无效或过期,返回拒绝策略
    return generatePolicy('unauthorized', 'Deny', event.methodArn);
  }
};

// 生成API Gateway要求的IAM策略格式
function generatePolicy(principalId, effect, resource) {
  return {
    principalId,
    policyDocument: {
      Version: '2012-10-17',
      Statement: [{
        Action: 'execute-api:Invoke',
        Effect: effect,
        Resource: resource
      }]
    }
  };
}
  • 把Firebase服务账号密钥和代码打包上传到Lambda,或者用AWS Secrets Manager存储密钥(更安全),然后在Lambda中读取。
  • 给Lambda配置基础的执行角色,确保它有权限写入CloudWatch日志(方便调试)。

3. 在API Gateway中绑定自定义授权器

  • 打开API Gateway控制台,进入你的目标API。
  • 左侧菜单选择Authorizers,点击Create New Authorizer:
    • 类型选Lambda,关联你刚创建的Lambda函数。
    • 身份来源选Header,输入Authorization(对应前端传Token的请求头)。
    • 勾选Invoke with caller credentials,保存授权器。

4. 给需要保护的API资源绑定授权器

  • 进入API的资源列表,选择你要保护的资源(比如/user-data)。
  • 打开该资源的Method Request配置,找到Authorization选项,选择你刚创建的自定义授权器。
  • 重新部署API到对应的阶段(比如prod),确保配置生效。

5. 前端请求API时传递Token

前端登录Firebase后,获取ID Token并在请求时放到Authorization头里:

const idToken = await firebase.auth().currentUser.getIdToken();
fetch('https://your-api-id.execute-api.your-region.amazonaws.com/prod/user-data', {
  headers: {
    'Authorization': `Bearer ${idToken}`
  }
});

关键注意事项

  • Lambda成本:AWS Lambda每月有100万次免费调用+400,000 GB-秒计算时间,小型应用完全够用,几乎无成本。
  • Token有效期:Firebase ID Token默认1小时有效,前端要记得在过期前自动刷新Token,避免请求失败。
  • 安全加固:可以在Lambda里额外验证Token的aud(受众)和iss(签发者),确保Token是针对你的Firebase项目颁发的。
  • 数据隔离:如果需要用户只能访问自己的数据,可以在API Gateway集成DynamoDB的配置里,用Lambda返回的principalId(即Firebase用户ID)作为过滤条件,实现细粒度的数据权限控制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:13