使用Serverless时如何为API授权器指定自定义错误状态码?
解决方案:将自定义授权器失败的返回码改为410
要实现这个需求,你只需要在Serverless配置中添加一个关键配置项,同时确保自定义授权器返回标准的拒绝策略即可,操作起来很简单:
步骤1:确保自定义授权器返回标准拒绝结构
首先,你的authorizerFunc在授权失败时,需要返回符合API Gateway要求的拒绝策略文档。以Node.js为例,示例代码如下:
exports.handler = async (event) => { // 这里替换成你的实际授权校验逻辑(比如token验证、权限检查等) const isValid = false; // 模拟授权失败场景 if (!isValid) { return { principalId: 'unauthorized-user', policyDocument: { Version: '2012-10-17', Statement: [ { Action: 'execute-api:Invoke', Effect: 'Deny', Resource: event.methodArn // 明确拒绝当前请求的API资源 } ] }, context: { errorMsg: 'Invalid or missing authorization credentials' } }; } // 授权通过时返回允许策略(保留原有逻辑即可) return { principalId: 'valid-user', policyDocument: { Version: '2012-10-17', Statement: [ { Action: 'execute-api:Invoke', Effect: 'Allow', Resource: event.methodArn } ] } }; };
步骤2:在Serverless配置中指定授权失败返回码
在getRoles函数的HTTP事件配置里,直接添加authorizationFailureOverride: 410,就能让API Gateway在授权失败时返回410,而非默认的401。如果需要自定义410的响应体,还可以补充responses配置。修改后的完整配置如下:
functions: authorizerFunc: handler: authorize.handler # Roles API getRoles: handler: allrolesget.handler events: - http: path: / method: get cors: true integration: lambda authorizer: name: authorizerFunc resultTtlInSeconds: 0 identitySource: method.request.header.Authorization # 补全你的实际身份信息来源 # 核心配置:指定授权失败返回410 authorizationFailureOverride: 410 # 可选:自定义410状态码的响应内容(保持CORS头一致避免跨域问题) responses: 410: description: "Authorization Failed" headers: Access-Control-Allow-Origin: "'*'" template: application/json: '{"error": "Authorization failed, please check your credentials"}'
原理说明
authorizationFailureOverride是Serverless Framework针对API Gateway提供的扩展配置,它会直接告诉网关:当自定义授权器返回拒绝(Deny)策略时,替换默认的401状态码为你指定的410。这样客户端收到410时,就能明确识别这是授权失败场景,执行对应的处理逻辑。
注意事项
- 确认
identitySource配置正确,它指定了授权器从哪里获取身份信息(比如请求头、查询参数等); - 自定义响应体时,务必保持CORS头和原有配置一致,避免跨域请求失败;
- 部署后记得测试:发送一个携带无效凭证的请求,验证是否返回410状态码和你定义的响应内容。
内容的提问来源于stack exchange,提问作者suku
相关产品推荐
相关产品推荐

