如何在AWS API Gateway中为Android应用开启CORS并限制仅自身应用访问
搞定这两个AWS API Gateway的CORS问题其实不难,我来给你拆解清楚,一步步来:
1. 如何在AWS API Gateway中为Android应用启用跨域资源共享(CORS)
Android原生应用调用API时,虽然不像浏览器那样有严格的同源策略限制,但如果API返回的响应没有正确的CORS头,部分网络库或场景下还是会出现请求失败的情况。配置步骤如下:
- 打开AWS控制台,进入API Gateway服务,选中你要配置的目标API
- 在左侧导航的Resources里,找到需要开启CORS的资源(可以是根资源
/,也可以是某个具体端点比如/users) - 点击顶部的Actions下拉菜单,选择Enable CORS
- 在弹出的配置窗口中,填写关键参数:
Access-Control-Allow-Origin:如果你的APP没有固定请求来源(大部分原生APP都是这种情况),可以先设为*(后续第二个需求会讲怎么收紧这个限制)Access-Control-Allow-Methods:勾选你的API支持的所有HTTP方法,比如GET、POST、PUT、DELETEAccess-Control-Allow-Headers:填入你的APP请求中会用到的自定义头,比如Content-Type、Authorization这些常用的,要是不确定可以多填几个常见的
- 点击Enable CORS and replace existing CORS headers,这时候别忘了点击Deploy API,选择你的部署阶段(比如
prod或者dev),让配置生效 - 额外提醒:如果你的API是和Lambda集成的,Lambda函数的响应里也必须返回对应的CORS头,不然还是会有问题。举个Lambda返回示例:
{ "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type,Authorization" }, "body": "Success response" }
2. 如何在AWS API Gateway中启用CORS,同时仅允许自身应用连接该API
这里要重点说一下:Android原生应用没有浏览器的同源策略限制,所以单纯靠CORS的Access-Control-Allow-Origin根本没法限制访问,必须结合身份验证手段才能真正实现“只允许自身应用调用”。推荐几种实用的方案:
方案一:API密钥验证
- 进入你的API,在左侧导航选择Settings,开启API Key Required(也可以针对单个方法开启,更灵活)
- 到API Keys页面,点击Create API Key生成一个密钥,把这个密钥安全地嵌入到你的Android应用里(建议用Android Keystore存储,别明文写在代码里)
- 创建Usage Plan,把你的API和刚才生成的API密钥关联起来,还能设置调用配额和速率限制,防止滥用
方案二:IAM身份验证
- 给你的Android应用创建一个IAM角色,配置权限允许它调用目标API(权限策略里添加
execute-api:Invoke动作,指定你的API ARN) - 在Android应用中使用AWS SDK,通过IAM凭证对请求进行签名,API Gateway会自动验证签名,只有合法的请求才能通过
方案三:自定义授权器(Lambda Authorizer)
- 在API Gateway的方法请求里添加一个自定义头,比如
X-App-Secret,这个值是你只有自己知道的密钥 - 创建一个Lambda函数作为授权器,用来检查请求中的
X-App-Secret是否和预设的值一致,一致就返回允许访问的策略,否则拒绝 - 把这个Lambda授权器关联到你的API方法上,这样只有携带正确
X-App-Secret的请求才能通过
至于CORS配置,这时候Access-Control-Allow-Origin可以设为*(因为原生APP不受这个限制),或者如果你的APP有固定的中转域名,也可以设为对应的域名。核心是靠上面的身份验证来限制访问。
内容的提问来源于stack exchange,提问作者Entertainment S




