如何用免费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
相关产品推荐
相关产品推荐

