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:

  1. 由于中国区没有Cognito用户池,所以此功能在中国区不可用。

  2. 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
}

当然如果使用自定义域名的话,那么域名也需要备案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/312183.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地搭建属于你自己的AI搜索引擎 支持多家AI模型

FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器&#xff0c;并使用 MULTI LLM 生成答案&#xff0c;无需 GPU。用户可以提出问题&#xff0c;系统将进行多引擎搜索&#xff0c;并将搜索结果合并到LLM中&#xff0c;并根据搜索结果生成答案。全部免费使用。 项目…

Java springboot使用EasyExcel读Excel文件,映射不到属性值,对象属性值都是null

如果你的类上有这个注解&#xff0c;去掉火或注释掉就可以了 Accessors(chain true)解决方法

解决EasyPoi导入Excel获取不到第一列的问题

文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题3. 解决问题1. 复现错误 使用EasyPoi导入数据时,Excel表格如下图: 但在导入时,出现如下错误: name为英文名称,在第一列,Excel表格有值,但导入的代码中为null,就很奇怪? 2. 分析错误 …

【数据结构1-基本概念和术语】

这里写自定义目录标题 0.数据&#xff0c;数据元素&#xff0c;数据项&#xff0c;数据对项&#xff0c;数据结构&#xff0c;逻辑结构&#xff0c;存储结构1.结构1.1逻辑结构1.2存储结构1.2.1 顺序结构1.2.2链式结构 1.3数据结构1.3.1基本数据类型1.3.2抽象数据类型1.3.2.1一个…

【系统分析师】系统安全分析与设计

文章目录 1、安全基础技术1.1 密码相关1.1.1对称加密1.1.2非对称加密1.1.3信息摘要1.1.4数字签名1.1.5数字信封 1.2 PKI公钥体系 2、信息系统安全2.1 保障层次2.2 网络安全2.2.1WIFI2.2.2 网络威胁与攻击2.2.3 安全保护等级 2.3计算机病毒与木马2.4安全防范体系 1、安全基础技术…

探索数据结构:BF与KMP的灵活应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是字符串匹配算法 字符串匹配是计算机科学中的一个基础概念&…

python创建word文档并向word中写数据

一、docx库的安装方法 python创建word文档需要用到docx库&#xff0c;安装命令如下&#xff1a; pip install python-docx 注意&#xff0c;安装的是python-docx。 二、使用方法 使用方法有很多&#xff0c;这里只介绍创建文档并向文档中写入数据。 import docxmydocdocx.Do…

SEO之搜索引擎的工作原理(三)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a;我给不会敲代码又想搭建网站的人建议 &#xff08;接上一篇。。。&#xff09; 排名 经过搜索引擎蜘蛛抓取页面&#xff0c;索引程序计算得到倒排索引后&#xff0c;搜索引擎就准备好可以随时处理用户搜索了…

C# 两种方法截取活动窗口屏幕,实现窗体截图

方法1&#xff0c;截屏内容仅包括活动窗口界面&#xff0c;而方法2是从屏幕范围取图&#xff0c;截屏内容会包括屏幕上所有内容。例如有一些程序在桌面顶层显示半透明的悬浮窗&#xff0c;用方法2截屏就会包括这些内容&#xff0c;并不是单纯的活动窗口内容。 方法1&#xff0c…

pyqt的人脸识别 基于face_recognition库

参考文献&#xff1a; 1、python face_recognition实现人脸识别系统_python facerecognition检测人脸-CSDN博客 2、cv2.VideoCapture()_cv2.videocapture(0)-CSDN博客 1、camera.py文件代码如下&#xff1b;目录如下 import sys from PyQt5.QtWidgets import QApplication, …

【机器学习】贝叶斯算法在机器学习中的应用与实例分析

贝叶斯算法在机器学习中的应用与实例分析 一、贝叶斯算法原理及重要性二、朴素贝叶斯分类器的实现三、贝叶斯网络在自然语言处理中的应用四、总结与展望 在人工智能的浪潮中&#xff0c;机器学习以其独特的魅力引领着科技领域的创新。其中&#xff0c;贝叶斯算法以其概率推理的…

Docker安装xxl-job分布式任务调度平台

文章目录 Docker安装xxl-job分布式任务调度平台1.xxl-job介绍2. 初始化“调度数据库”3、docker挂载运行xxl-job容器3.1、在linux的opt目录下创建xxl_job文件夹&#xff0c;并在里面创建logs文件夹和application.properties文件3.2、配置application.properties文件&#xff0c…

数据结构 -- 二分查找

本文主要梳理了二分查找算法的几种实现思路&#xff0c;基本概念参考 顺序、二分、哈希查找的区别及联系_生成一个大小为10万的有序数组,随机查找一个元素,分别采用顺序查找和二分查找方式-CSDN博客 1、基本概念 &#xff08;1&#xff09;前提条件&#xff1a;待查找数据必须…

GPT 浅析

GPT 浅析 文章目录 GPT 浅析GPT 1无监督预训练有监督微调任务相关的输入变换 GPT2GPT3 GPT 1 在模型架构上&#xff0c;GPT-1基于Transformer构造&#xff0c;这是因为与其他卷积神经网 络或者循环神经网络相比&#xff0c;Transformer提供了效率更高的方法来处理文本 中的长期…

leetcode hot100_day20

4/14/2024 128.最长连续序列 自己的 这是前两天做一半的题目了。这题给我的教训就是用哈希表的时候一定一定要考虑重复元素的问题&#xff01;&#xff01;&#xff01;&#xff01; 这题让我想到了最长递增子序列&#xff0c;只是名字有点像。子序列和子数组还不一样一个连续…

【HCIP学习】OSPF协议基础

一、OSPF基础 1、技术背景&#xff08;RIP中存在的问题&#xff09; RIP中存在最大跳数为15的限制&#xff0c;不能适应大规模组网 周期性发送全部路由信息&#xff0c;占用大量的带宽资源 路由收敛速度慢 以跳数作为度量值 存在路由环路可能性 每隔30秒更新 2、OSPF协议…

错误分析 (Machine Learning研习十九)

错误分析 您将探索数据准备选项&#xff0c;尝试多个模型&#xff0c;筛选出最佳模型&#xff0c;使用 Grid SearchCV微调其超参数&#xff0c;并尽可能实现自动化。在此&#xff0c;我们假设您已经找到了一个有前途的模型&#xff0c;并希望找到改进它的方法。其中一种方法就…

第九届少儿模特明星盛典 全球赛推广大使『武家翔』精彩回顾

2024年1月30日-2月1日&#xff0c;魔都上海迎来了龙年第一场“少儿形体行业美育春晚”&#xff01;由IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官&#xff01;近2000名少儿模特选手从五湖四海而来&#xff0c;决战寒假这场高水准&#xff0c;高人气&#xff…

uni-app学习

目录 一、安装HBuilderX 二、创第一个uni-app 三、项目目录和文件作用 四、全局配置文件&#xff08;pages.json&#xff09; 4.1 globalStyle&#xff08;全局样式&#xff09; 导航栏&#xff1a;背景颜色、标题颜色、标题文本 导航栏&#xff1a;开启下拉刷新、下拉背…

Axure实现导航栏的展开与收缩

Axure实现导航栏的展开与收缩 一、概要介绍二、设计思路三、Axure制作导航栏四、技术细节五、小结 一、概要介绍 使用场景一般是B端后台系统需要以导航栏的展开与收缩实现原型的动态交互&#xff0c;主要使用区域是左边或者顶部的导航栏展开与收缩&#xff0c;同一级导航下的小…