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 json


def 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 response
        return 'unauthorized'
    try:
        return json.loads(response)
    except BaseException:
        print('unauthorized')
        return 'unauthorized'  # Return a 500 error


def generatePolicy(principalId, effect, resource):
    authResponse = {}
    authResponse['principalId'] = principalId
    if (effect and resource):
        policyDocument = {}
        policyDocument['Version'] = '2012-10-17'
        policyDocument['Statement'] = []
        statementOne = {}
        statementOne['Action'] = 'execute-api:Invoke'
        statementOne['Effect'] = effect
        statementOne['Resource'] = resource
        policyDocument['Statement'] = [statementOne]
        authResponse['policyDocument'] = policyDocument
    authResponse['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 json


def 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 response
        else:
            print('denied')
            return response
    except 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 AWSRequest

class BotoSigV4Auth(AuthBase):
    """为 HTTP 请求创建 AWS Signature V4"""
    def __init__(self, service, region):
        self.service = service
        self.region = region
        self.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 r

def main():
    # 配置
    service = 'execute-api'
    region = 'us-east-1'
    api_url = 'https://你的api网关.execute-api.us-east-1.amazonaws.com/你的阶段/你的资源'
    
    # 创建 requests Session
    session = 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 requests

url = "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 Pool

def 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
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LangChain-Chatchat 开源知识库来了

LangChain-Chatchat 开源知识库来了 LangChain-Chatchat 架构设计LangChain-ChatChat 具体实现过程 一键本地离线部署软件环境硬件环境支持三种部署方式 LangChain-Chatchat 是基于 ChatGLM 等大语言模型与 LangChain 等应用框架实现&#xff0c;开源、可离线部署的 RAG 检索增…

Django数据导出与导入问题

执行: python manage.py loaddata data.json 的常见错误: * 1. UnicodeDecodeError: utf-8 codec cant decode byte 0xff in position 0: invalid start byte* 2. raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",...django.core.serializer…

vue的就地更新与v-for的key属性

vue的就地更新 Vue中的就地更新到底是怎么回事&#xff0c;为什么会存在就地更新的现象&#xff1f; 注意下面的例子&#xff0c;使用v-for指令时&#xff0c;没有绑定key值&#xff0c;才有就地更新的现象&#xff0c;因为Vue默认按照就地更新的策略来更新v-for渲染的元素列表…

windows Webrtc +VS2019 (M124)下载编译以及调通测试demo

下载depot tools 设置梯子 git config --global http.proxy 127.0.0.1:10000 git config --global https.proxy 127.0.0.1:10000 下载 $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 设置depot_tools目录为环境变量 下载webrtc # 设置系统代…

CommunityToolkit.Mvvm笔记1---Instruction

CommunityToolkit.Mvvm是一个官方社区套件(Windows Community Toolkit)&#xff0c;延续了MVVMLight的风格&#xff0c;是一个现代、快速和模块化的 MVVM 库。 它是 .NET 社区工具包的一部分。 第一&#xff1a;入门安装 1&#xff0c;用NuGget安装&#xff0c;搜索Community…

.NET 发布,部署和运行应用程序

.NET应用发布 发布.Net应用有很多种方式&#xff0c;下面列举三种发布方式&#xff1a; 单文件发布跨平台发布Docker发布 单文件发布 右键工程&#xff0c;选择“发布”&#xff0c;部署模式选择“独立”&#xff0c;目标运行时选择自己想要部署到的系统&#xff0c;我这里用…

【Windows10】Anaconda3安装+pytorch+tensorflow+pycharm

文章目录 一、下载anaconda0.双击下载的文件1. 选择All users2. 安装路径3. 勾选环境变量和安装python4.安装完成5.添加环境变量6.测试是否安装成功 二、安装pytorch&#xff08;先看四&#xff01;先检查一下自己电脑是不是只能安装GPU版的1.查看conda图形化界面2.在安装pytor…

ES源码二:集群启动过程

命令行参数解析 Elasticsearch&#xff1a;在main里面创建了Elasticsearch实例&#xff0c;然后调用了main方法&#xff0c;这个main方法最终会调用到父类Command的main方法 这里做了几件事&#xff1a; 注册一个 ShutdownHook&#xff0c;其作用就是在系统关闭的时候捕获IO…

使用SpringBoot3+Vue3开发公寓管理系统

项目介绍 公寓管理系统可以帮助公寓管理员更方便的进行管理房屋。功能包括系统管理、房间管理、租户管理、收租管理、房间家具管理、家具管理、维修管理、维修师傅管理、退房管理。 功能介绍 系统管理 用户管理 对系统管理员进行管理&#xff0c;新增管理员&#xff0c;修改…

CentOS 7开机启动过程,引导和服务,密码的修改

开机启动过程&#xff1a; 引导过程&#xff1a;1.开机自检(BIOS)->2.MBR引导->GRUB菜单->加载内核kernel->systemd进程初始化 程序&#xff1a;执行特定任务的一串代码&#xff0c;静态&#xff0c;存在硬盘中。 进程&#xff1a;运行中的程序叫进程&#xff0…

Unity 点击次数统计功能

介绍 &#x1f4a1;.调用方便&#xff0c;发生点击事件后直接通过"xxx".CacheClick缓存 &#x1f4a1;. 在允许的时间间隔内再次点击会累计点击次数&#xff0c;直到超出后触发事件 传送门&#x1f448;

计算机视觉——OpenCV Python基于颜色识别的目标检测

1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛&#xff0c;它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来&#xff0c;这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…

uniapp--登录和注册页面-- login

目录 1.效果展示 2.源代码展示 测试登录 login.js 测试请求 request.js 测试首页index.js 1.效果展示 2.源代码展示 <template><view><f-navbar title"登录" navbarType"4"></f-navbar><view class"tips"><…

2024蓝桥杯每日一题(最大公约数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;公约数 试题二&#xff1a;最大公约数 试题三&#xff1a;等差数列 试题四&#xff1a;最大比例 试题五&#xff1a;Hankson的趣味题 试题一&#xff1a;公约数 【题目描述】 …

冯喜运:4.16晚间关注原油EIA数据黄金原油分析

【 黄金技术面分析】&#xff1a;周二黄金价格日内走跌&#xff0c;白盘低点触及2363一线止跌反弹&#xff0c;实时现报价2372一线。目前小时线布林带逐步收口&#xff0c;上轨位于2392一线&#xff0c;下轨布林带在2351位置。今晚阻力关注2389和今日高点2392区域&#xff0c;其…

二级综合医院云HIS系统源码,B/S架构,采用JAVA编程,集成相关医保接口

二级医院云HIS系统源码 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一系列常规功能&#xff0c;还能与公卫…

海外云手机为什么适合社媒运营?

如今&#xff0c;社媒营销如果做得好&#xff0c;引流效果好的账号&#xff0c;可以用来带货变现&#xff0c;而外贸、品牌出海也同样都在做社媒营销&#xff0c;Tik Tok、facebook、ins等热门的海外社媒平台都是行业密切关注的&#xff0c;必要的时候&#xff0c;大家会使用海…

基于微信小程序投票评选系统的设计与实现(论文+源码)_kaic

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮…

Unity类银河恶魔城学习记录12-18,19 p140 Options UI-p141 Finalising ToolTip源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_ToolTip.cs using TMPro; using UnityEngine;public class UI_ToolTip :…

AppleScript初体验,让你的mac实现自动化UI操作

AppleScript 简介 AppleScript是苹果公司开发的一种脚本语言&#xff0c;用于操作MacOS及其应用程序&#xff0c;在实现MacOS自动化工作方面非常给力。 我们可以使用AppleScript用来完成一些重复琐碎的工作&#xff0c;AppleScript具有简单自然的语法&#xff0c;另外系统也提…