APIGateway的认证
APIGateway的支持的认证如下:
我们从表格中可以看到,HTTP API 不支持资源策略的功能,另外是通过JWT的方式集成Cognito的。
对于REST API则是没有显示说明支持JWT认证,这个我们可以通过Lambda 自定义的方式来实现。
所以按照这个说法,除了资源策略,各种认证方式HTTP API和REST API 都能够实现。

资源策略
note:HTTP API没有资源策略,所以这个部分都都是关于REST API的。
先谈资源策略,因为这个是两个API唯一不同的地方。
资源策略默认为空,对于公有API来是完全放开的,但是如果写了任意一条策略,那么其他的策略都会变成Deny,但是对于私有API来说,没有资源策略则意味着完全私有。
下面是三种资源策略:
允许特定的账户访问APIGateway,因为访问人是账户,所以这个就需要开启IAM验证。
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"AWS": ["arn:aws:iam::{{otherAWSAccountID}}:root","arn:aws:iam::{{otherAWSAccountID}}:user/{{otherAWSUserName}}","arn:aws:iam::{{otherAWSAccountID}}:role/{{otherAWSRoleName}}"]},"Action": "execute-api:Invoke","Resource": ["execute-api:/{{stageNameOrWildcard*}}/{{httpVerbOrWildcard*}}/{{resourcePathOrWildcard*}}"]}]
}
基于IP的访问策略如下:。
{"Version": "2012-10-17","Statement": [{"Effect": "Deny","Principal": "*","Action": "execute-api:Invoke","Resource": "execute-api:/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}","Condition" : {"IpAddress": {"aws:SourceIp": [ "{{sourceIpOrCIDRBlock}}", "{{sourceIpOrCIDRBlock}}" ]}}},{"Effect": "Allow","Principal": "*","Action": "execute-api:Invoke","Resource": "execute-api:/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}"}]
}
允许来自来自特定VPC的流量:
{"Version": "2012-10-17","Statement": [{"Effect": "Deny","Principal": "*","Action": "execute-api:Invoke","Resource": "execute-api:/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}","Condition": {"StringNotEquals": {"aws:sourceVpc": "{{vpcID}}"}}},{"Effect": "Allow","Principal": "*","Action": "execute-api:Invoke","Resource": "execute-api:/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}"}]
}
Lambda授权方
Lambda的认证方式可以自定义认证的方式,以下是一个官方提供的RSET API认证的例子,当然也在这个代码中实现JWT的颁发认证,以及SSO中我们常用的Oauth,SAML和OIDC协议 。
REST API
# A simple token-based authorizer example to demonstrate how to use an authorization token
# to allow or deny a request. In this example, the caller named 'user' is allowed to invoke
# a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke
# the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
# string, the authorizer function returns an HTTP 401 status code. For any other token value,
# the authorizer returns an HTTP 500 status code.
# Note that token values are case-sensitive.import jsondef lambda_handler(event, context):token = event['authorizationToken']if token == 'allow':print('authorized')response = generatePolicy('user', 'Allow', event['methodArn'])elif token == 'deny':print('unauthorized')response = generatePolicy('user', 'Deny', event['methodArn'])elif token == 'unauthorized':print('unauthorized')raise Exception('Unauthorized') # Return a 401 Unauthorized responsereturn 'unauthorized'try:return json.loads(response)except BaseException:print('unauthorized')return 'unauthorized' # Return a 500 errordef generatePolicy(principalId, effect, resource):authResponse = {}authResponse['principalId'] = principalIdif (effect and resource):policyDocument = {}policyDocument['Version'] = '2012-10-17'policyDocument['Statement'] = []statementOne = {}statementOne['Action'] = 'execute-api:Invoke'statementOne['Effect'] = effectstatementOne['Resource'] = resourcepolicyDocument['Statement'] = [statementOne]authResponse['policyDocument'] = policyDocumentauthResponse['context'] = {"stringKey": "stringval","numberKey": 123,"booleanKey": True}authResponse_JSON = json.dumps(authResponse)return authResponse_JSON
这个是官方文档的一张图:

也就是说当访问APIGatewa有的时候会带上一个凭证,然后这个凭证会被传递到负责验证的Lambda中,这个lambda会根据传递的请求头会返回allow或者deny的资源策略,或者unauthorized的异常。

在Header中添加{Authorization: allow},是可以请求成功的。

在Header中添加{Authorization: deny},可以按照预期拦截。

在Header中添加未认证的token,即不在黑白名单内的,报错500 符合预期

HTTP API
然后我们再来看HTTP API,由于没有资源策略,所以授权方函数的代码和之前不一样。授权方的配置如下:

再来看一看代码,
import jsondef lambda_handler(event, context):response = {"isAuthorized": False,"context": {"stringKey": "value","numberKey": 1,"booleanKey": True,"arrayKey": ["value1", "value2"],"mapKey": {"value1": "value2"}}}try:if (event["headers"]["authorization"] == "secretToken"):response = {"isAuthorized": True,"context": {"stringKey": "value","numberKey": 1,"booleanKey": True,"arrayKey": ["value1", "value2"],"mapKey": {"value1": "value2"}}}print('allowed')return responseelse:print('denied')return responseexcept BaseException:print('denied')return response
在Header中添加{Authorization: secretToken},是可以请求成功的。

如果在请求的时候没有添加Authorization的Header,这个时候是返回401 “message”: “Unauthorized”,由于我们没有在请求的时候带入身份,所以会返回401。

如果传递的token不对,那么会报错403 “message”: “Forbidden”。即我们传递了一个token到后端,但是没有通过认证,也就说没有对应的权限。

Cognito 授权
note:
由于中国区没有Cognito用户池,所以此功能在中国区不可用。
REST API 提供了直接集成Cognito的方式,对于HTTP API而言可以使用JWT的方式来支持Cognito。
下面启动一个Cognito用户池,由于是简单测试,所以没有集成第三方身份提供商。

接下来设置密码策略并且关闭MFA,然后下一步直接到 Step 5 Integrate your app。


使用托管UI并且设置Cognito domain的URL,以及回调URL。随后我们通过内置的Cognito UI登录,会调转到我们设置的回调函数,同时带着我们需要的凭证。


接下来是创建用户,我们接下来要我们使用这个用户登录Cognito UI。

然后编辑托管UI的配置选择Implicit grant

登录之后会跳转到我们的设置的回调函数,同时会返回id_token,access_token。

设置Cognito授权方,选择前面创建好的Cognito用户池,然后设置加上请求头Authorization。

填写之后可以测试,使用前面回调返回的id_token,这里测试之后,重新部署API 然后再使用Postman再次测试。

Postman的设置如下,这里添加了请求头{ Authorization: <ID_token> }

IAM 授权
IAM 认证比较特殊,对于中国区而言,如果你没有备案,那么只能使用IAM认证的方式进行认证。
这里其实就是SignV4的算法,我们可以使用Postman来做签名,如下:

如果你的应用需要使用SignV4访问API使用代码:
import boto3
import requests
from requests.auth import AuthBase
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequestclass BotoSigV4Auth(AuthBase):"""为 HTTP 请求创建 AWS Signature V4"""def __init__(self, service, region):self.service = serviceself.region = regionself.session = boto3.Session()self.credentials = self.session.get_credentials()def __call__(self, r):aws_request = AWSRequest(method=r.method, url=r.url, data=r.body)SigV4Auth(self.credentials, self.service, self.region).add_auth(aws_request)r.headers.update(dict(aws_request.headers.items()))return rdef main():# 配置service = 'execute-api'region = 'us-east-1'api_url = 'https://你的api网关.execute-api.us-east-1.amazonaws.com/你的阶段/你的资源'# 创建 requests Sessionsession = requests.Session()session.auth = BotoSigV4Auth(service, region)# 发送 GET 请求response = session.get(api_url)# 打印响应print("Response Status Code:", response.status_code)print("Response Text:", response.text)if __name__ == "__main__":main()
JWT 授权
note: 这个部分属于HTTP API的认证,REST API
由于OIDC协议使用JWT作为中间凭证,所以在这里可以使用Auth0来代替JWT的颁发商。配置如下:
在Applications - APIS中新建API:

然后这个时候,auth0 会自动生成一个Application,后续我们会使用这个Application的Client ID和Secret ID以及Domain的信息来登录。
也就是说这三个信息确定了一个身份池,然后符合规则的用户可以通过这个身份池来换取JWT。可以在Applications-Applications 中看到。

配置好之后,可以通过Auth0的API来拿到登录后的JWT,以下是一个官方给的教程可以用来测试功能,当然也可以集成到APP中。
APIGateway 的Authorization 配置如下:

auth0 也提供了实例代码供我们测试:

官方提供的代码很烂,这个功能完全可以使用requests来实现,代码如下:
import requestsurl = "https://xuhan.au.auth0.com/oauth/token"payload = {"client_id": "iiptrnicFRTaDduDsWQ6W9WlHm0cdvMp","client_secret": "POQsksHOg3330gITitO4-7B_wYBID8xgMN9-Tz8Asp8R6PbXxSg1vq6De8HoIn7p","audience": "https://auth0-jwt-authorizer","grant_type": "client_credentials"
}headers = {'content-type': "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.text)
然后可以使用Postman来进行验证,其实就是在请求头中加上了Authorization: Bearer < your JWT>,这样是可以通过客户端加上凭证范访问APIGateway.

APIKEY
APIKEY本来是用来做限流的功能,比如说某个服务会提供API给开发者使用,但同时又不希望开发者滥用这样的凭证,所以才有了这个功能。很多人会把这个当成限制匿名用户的一部分,虽然这样的解释没有问题,但是APIKEY的作用仍然是做限流而不是认证。
对于REST API来说APIKEY通常与使用计划关联,然后再再特定的路由中启动APIKEY。在使用计划中写明Burst limit和Rate limit,以及每天或者每月的额度。然后在请求头中带上x-api-key: your apikey

速率限制(Burst limit) :设计用来控制较长时间尺度(如每秒)内的平均请求量,确保服务的稳定性和可靠性,防止 API 被过度使用。
突发限制(Rate limit): 设计用来处理短时间内的高流量突发,允许在极短的时间窗口内接受较多请求,但不应持续太久,以避免服务器资源被迅速耗尽。
使用Python多进程测试代码如下,实测达到任意限制都会报错 429 {“message”:“Too Many Requests”}
import requests
from multiprocessing import Pooldef make_request(url):headers = {'x-api-key': 'your key api'}response = requests.get(url, headers=headers)if response.status_code != 200:return f"Request failed. Status: {response.status_code} Response: {response.text}"return "Request successful."def main():url = "your url"process_count = 100 # 你可以根据需要调整进程数量with Pool(process_count) as p:results = p.map(make_request, [url] * 10) # 发送10次请求# 打印出所有结果,包括成功和失败的for result in results:print(result)if __name__ == '__main__':main()

对于HTTP API 来说则是直接在阶段设置就可以,同样可以达到限流的效果。

最后关于中国区
中国区有一个特殊的流程叫做ICP备案, 如果没有进行备案的话,那么无论是公网访问还是内网访问,都会遇到如下的401报错
{"message": null
}
当然如果使用自定义域名的话,那么域名也需要备案。
相关文章:
APIGateway的认证
APIGateway的支持的认证如下: 我们从表格中可以看到,HTTP API 不支持资源策略的功能,另外是通过JWT的方式集成Cognito的。 对于REST API则是没有显示说明支持JWT认证,这个我们可以通过Lambda 自定义的方式来实现。 所以按照这个…...
MacOS Github Push项目 精简版步骤
大白菜教程:小白菜 macOS github提交代码-CSDN博客 步骤1:git init步骤2: touch .gitignore 创建ignore文件 open .gitignore 打开ignore文件 编写ignore文件.idea/ 是文件夹的意思.git/ 也是自动生成的文件夹 也不上传.DS_St…...
Eclipse的基本使用讲解(建项目,建包,建类,写代码(基本语法))新手入门必备
目录 一.介绍eclipse 二.操作Eclipse 1.选择工作空间 2.建项目,建包,建类 1.建项目(两种) 2.建包 3.建类 三.写代码(基本语法) 1.代码操作 2.代码规范 3.代码注释 一.介绍eclipse Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其…...
3D模型处理的并行化
今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息,并分享我发现的一些小技巧,例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 那么我们为什么要诉诸并行计算呢? 使用数据有时会出现…...
盲人安全导航技巧:科技赋能让出行更自如
作为一名资深记者,长期关注并报道无障碍领域的发展动态。今日,我将聚焦盲人安全导航技巧,探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障…...
问,由于java存在性能上,以及部分功能上的缺点,请问如何正确使用C,C++,Go,这三个语言,提升Java Web项目的性能?
拓展阅读:版本任你发,我用java8 我明白Java虽然在许多方面表现出色,但在某些特定场景下可能会遇到性能瓶颈或功能限制。为了提升Java Web项目的性能,可以考虑将C、C和Go这三种语言用于特定的组件或服务。以下是如何正确使用这些语…...
【信号与系统 - 9】傅里叶变换的性质习题
1 习题 已知 f ( t ) f(t) f(t) 的傅里叶变换为 F ( j w ) F(jw) F(jw) ,求如下信号的傅里叶变换 (1) t ⋅ f ( 3 t ) t\cdot f(3t) t⋅f(3t) 解: f ( 3 t ) ↔ 1 3 F ( j w 3 ) f(3t)\leftrightarrow \frac{1}{3}F(j\frac{w}…...
C#探索之路基础夯实篇(5):语法糖概念解析
C#探索之路基础夯实篇(5):语法糖概念解析 文章目录 C#探索之路基础夯实篇(5):语法糖概念解析1、概念定义2、Lua中的语法糖3、C#中的语法糖4、C中的语法糖5、优缺点辨析6、适用范围7、总结 从之前一开始接触lua的时候开始,开始第一次接触到语法…...
SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比
产品概述 Apache SeaTunnel 是一个非常易用的超高性能分布式数据集成产品,支持海量数据的离线及实时同步。每天可稳定高效同步万亿级数据,已应用于数百家企业生产,也是首个由国人主导贡献到 Apache 基金会的数据集成顶级项目。 SeaTunnel 主要解决数据集成领域的常见问题:…...
深入理解汇编:平栈、CALL和RET指令详解
视频学习下载地址:https://pan.quark.cn/s/04e6946a803a 汇编语言以其接近硬件的特性和高效的执行速度,在系统编程、性能优化和逆向工程中占有不可或缺的地位。本文将深入探讨汇编语言中的平栈操作以及CALL和RET指令&#…...
DP4 最小花费爬楼梯
原题链接:最小花费爬楼梯_牛客题霸_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dp。 开一个dp数组和a数组。dp[i]表示在当前这一格所需要的费用,a数组其实就是题目中的cost数组。 因为最后要求到顶楼的最低费用&a…...
OpenXR API概览与核心组件解析
在虚拟现实(VR)和增强现实(AR)领域,OpenXR API提供了一个重要的开放标准,使得开发者能够跨多种硬件和软件平台创建兼容的应用。本文将详细解释OpenXR中的核心组件和数据结构,并探讨它们如何共同…...
安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包
前言: 最近在完成公司的项目时,为了兼容其他的版本,需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包,安装成功之后,分享如下: 安装命令: ant-design-vue: 不…...
Zynq7000系列中的休眠模式
休眠模式是在系统层面定义的,它包括将APU置于待机模式,并将多个控制器保持在无时钟的复位状态。 进入休眠模式可以大大降低功耗。在休眠模式下,大多数功能时钟组都会被关闭或断电。唯一需要保持活动的设备是一个CPU、窥探控制单元(…...
在redhat7/8平台上部署ELK7.17.18的技术方案
部署环境说明 为节省资源直接使用1台测试机模拟3节点elasticsearch服务集群做部署,在该主机上同时部署了3个elasticsearch实例、1个logstash实例、1个kibana实例、1个filebeat实例。对于生产环境,以上实例服务应该做分布式部署。 ELK-TEST1 192.168.10…...
(Chat For Al,创新Al,汇语Al助手,AiTab新标签,万能助手,LLaVA)分享6个好用的ChatGPT
目录 1、Chat For AI 2、创想AI 3、汇语AL助手...
MySQL-锁篇
文章目录 表级锁和行级锁了解吗?有什么区别?行级锁使用有什么注意事项?InnoDB有哪几类行锁?共享锁和排他锁是什么?意向锁有什么用? 锁是一种常见的并发事务的控制方式 表级锁和行级锁了解吗?有什…...
滤波器笔记(杂乱)
线性相位是时间平移,相位不失真 零、基础知识 1、用相量表示正弦量 https://zhuanlan.zhihu.com/p/345546880 https://www.zhihu.com/question/347763932/answer/1103938667 A s i n ( ω t θ ) ⇔ A e j θ ⇔ A ∠ θ Asin(\omega t\theta) {\Leftrightarrow…...
【ARFoundation自学01】搭建AR框架,检测平面点击位置克隆物体
Unity开发ARFoundation相关应用首先安装ARFoundation包 然后设置XR 1.基础AR场景框架搭建 2.一个基本的点击克隆物体到识别的平面脚本 挂在XROrigin上 脚本AppController 脚本说明书 ## 业务逻辑 AppController 脚本旨在实现一个基本的 AR 应用程序功能:用户通过…...
.Net ajax 接收参数
后端部分代码 一般处理程序 public void ProcessRequest(HttpContext context){context.Response.ContentType "text/plain";string str_index context.Request.Form.AllKeys.Contains("index") ? context.Request.Form["index"].ToString(…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
