如何使用Node.js在AWS中通过HTTPS API为Lambda函数配置自定义授权器
用Node.js在AWS HTTPS API中为Lambda配置自定义授权器
以下是针对新手的分步操作指南,包含代码示例和关键注意事项:
1. 创建自定义授权器Lambda函数
首先在AWS控制台创建一个Node.js运行时的Lambda函数,用于验证请求合法性并生成IAM策略:
授权器Lambda代码示例
exports.handler = async (event) => { // 提取请求头中的Authorization令牌 const authHeader = event.headers?.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return generatePolicy('unauthorized', 'Deny', event.routeArn); } const token = authHeader.split(' ')[1]; // -------------------------- // 这里替换为你的真实令牌验证逻辑 // 示例:简单验证令牌是否匹配预设值(生产环境请用JWT/OAuth2等安全方式) const isValid = token === 'your-valid-secret-token'; // -------------------------- if (!isValid) { return generatePolicy('unauthorized', 'Deny', event.routeArn); } // 验证通过,返回允许策略,可附加上下文信息给后端Lambda return generatePolicy('valid-user-123', 'Allow', event.routeArn, { userId: 'user-123', userRole: 'editor' }); }; // 生成标准IAM策略的辅助函数 function generatePolicy(principalId, effect, resource, context) { const policy = { Version: '2012-10-17', Statement: [{ Action: 'execute-api:Invoke', Effect: effect, Resource: resource }] }; const response = { principalId, policyDocument: policy }; if (context) response.context = context; return response; }
注意事项
- 生产环境请使用
jsonwebtoken库验证JWT令牌(需在Lambda层或打包时包含依赖) - 确保Lambda执行角色有基本的日志权限(方便排查问题)
2. 配置API Gateway自定义授权器
- 打开AWS API Gateway控制台,选择你的HTTPS API
- 进入授权器页面,点击「创建授权器」:
- 类型选择「Lambda」
- 选择刚才创建的授权器Lambda函数
- 身份源填写
$request.header.Authorization(指定从请求头提取令牌) - 输入授权器名称(如
CustomAPIAuthorizer),保存
- 将授权器绑定到需要保护的路由:
- 进入路由页面,选择目标路由(如
/protected) - 编辑该路由的集成设置,在「授权」下拉框中选择刚创建的授权器
- 保存后重新部署API(API Gateway需部署才会生效)
- 进入路由页面,选择目标路由(如
3. 测试授权流程
测试授权器Lambda
在Lambda控制台创建测试事件,模拟API Gateway发送的请求:
{ "headers": { "authorization": "Bearer your-valid-secret-token" }, "routeArn": "arn:aws:execute-api:us-east-1:your-account-id:your-api-id/*/GET/protected" }
执行测试,检查返回的策略是否为Allow状态。
测试HTTPS API
使用curl或Postman发送请求:
- 合法请求(带正确令牌):
应返回200状态码和后端Lambda的响应。curl -H "Authorization: Bearer your-valid-secret-token" https://your-api-id.execute-api.us-east-1.amazonaws.com/protected - 非法请求(无令牌或错误令牌):
应返回401或403状态码。curl https://your-api-id.execute-api.us-east-1.amazonaws.com/protected
4. 后端Lambda获取授权上下文
如果授权器返回了上下文信息,后端Lambda可以通过event.requestContext.authorizer获取:
exports.handler = async (event) => { const { userId, userRole } = event.requestContext.authorizer; return { statusCode: 200, body: JSON.stringify({ message: '访问受保护资源成功', userId, userRole }) }; };
内容的提问来源于stack exchange,提问作者Viranga Bogahalanda
相关产品推荐
相关产品推荐

