如何让AppSync请求同时验证api_key与aws_iam两种授权?
AppSync同时要求API Key和IAM授权的实现方案
单个AppSync请求默认仅支持使用一种授权类型,你在Schema里同时添加@aws_api_key和@aws_iam指令的效果是「满足任意一种授权即可访问」,而非同时满足,这就是你之前配置未达预期的原因。
要实现「必须同时携带有效API Key和IAM签名才能访问」的需求,需要结合解析器请求模板做额外校验,具体步骤如下:
1. 先启用两种授权类型
在AppSync API的配置页面,同时开启API Key和AWS IAM两种授权类型,确保两种授权的请求都能进入解析器环节。
2. 在解析器中添加双重校验逻辑
以getCar查询的解析器为例,修改其请求映射模板,同时验证两种身份标识是否存在:
#if( !$context.identity.apiKey || !$context.identity.iam ) $util.unauthorized("必须同时提供有效的API Key和IAM签名") #end { "version": "2018-05-29", "operation": "GetItem", "key": { "id": { "S": "$context.arguments.id" } } }
逻辑说明:
$context.identity.apiKey:存在则说明请求携带的API Key已通过AppSync的有效性验证$context.identity.iam:存在则说明请求的IAM签名已通过AppSync的身份验证- 只要其中一个标识不存在,就通过
$util.unauthorized抛出未授权错误,阻断数据查询
3. 保留Schema中的双授权指令
你的Schema代码无需修改,继续保留@aws_api_key和@aws_iam指令,确保两种授权的请求都能触发解析器:
type Car @aws_api_key @aws_iam { id: ID! year: Int color: String tireType: String } type Query { getCar(id: ID!): Car @aws_api_key @aws_iam }
这样配置后,只有同时携带有效API Key和IAM签名的请求,才能通过解析器校验并获取数据;仅携带其中一种授权的请求会被拦截返回未授权。
内容的提问来源于stack exchange,提问作者vtrance24
相关产品推荐
相关产品推荐

