You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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方法,比如GETPOSTPUTDELETE
    • Access-Control-Allow-Headers:填入你的APP请求中会用到的自定义头,比如Content-TypeAuthorization这些常用的,要是不确定可以多填几个常见的
  • 点击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

火山引擎 最新活动