• 我的订阅
  • 科技

使用 Golang 的自定义 API 网关授权方

类别:科技 发布时间:2023-05-08 09:17:00 来源:卓越科技

使用无服务器进行构建的好处之一是,您可以以一种可组合的方式设计事物。这意味着您可以将逻辑与其他志同道合的逻辑紧密结合在一起,然后让事物与其他组件保持松散耦合,以便事物易于更改而不会太脆弱。构建API时,您通常需要某种授权方来验证所提供的令牌。在本文中,我将逐步介绍如何使用Golang构建自定义API网关授权方。使用Golang的API网关授权方作为参考,这是我想向您展示的架构图。使用Golang的API网关授权方

使用 Golang 的自定义 API 网关授权方

以上实现的是以下内容定义一个API网关来管理我们资源的有效负载使用Lamabda处理授权针对Cognito用户池验证令牌利用具有自定义设置TTL的缓存来节省计算最后,如果一切顺利,允许访问受保护的资源也将能够提供对声明上下文的覆盖这篇文章还有另一半,我将向您展示如何使用Lambdas和DyanamoDB扩展我们将使用的JWT。如果您对此感到好奇,这里的文章将向您展示这是如何完成的遍历代码CDK从Cognito开始要使用Cognito进行验证,我们首先需要构建一个Cognito实例以及一个能够登录的客户端。定义UserPool如下所示。没有什么需要额外解释的,所以让我们继续讨论客户端。this._pool=newcognito.UserPool(this,"SamplePool",{userPoolName:"SamplePool",selfSignUpEnabled:false,signInAliases:{email:true,username:true,preferredUsername:true,},autoVerify:{email:false,},standardAttributes:{email:{required:true,mutable:true,},},customAttributes:{isAdmin:newcognito.StringAttribute({mutable:true}),},passwordPolicy:{minLength:8,requireLowercase:true,requireDigits:true,requireUppercase:true,requireSymbols:true,},accountRecovery:cognito.AccountRecovery.EMAIL_ONLY,removalPolicy:cdk.RemovalPolicy.DESTROY,});将客户端添加到UserPool也很简单。这么多的选择,但我下面的是相当香草。使用此客户端,您可以通过一种方式与用户一起登录并针对它进行其他应用程序开发。正如您稍后将在本文中看到的那样,我只是使用Postman将所有这些整合在一起。this._pool.addClient("sample-client",{userPoolClientName:"sample-client",authFlows:{adminUserPassword:true,custom:true,userPassword:true,userSrp:false,},idTokenValidity:Duration.minutes(60),refreshTokenValidity:Duration.days(30),accessTokenValidity:Duration.minutes(60),});建立授权者现在“自定义”使用Golang构建自定义API网关授权器。Authorizer只不过是一个Lambda函数。因此,如果您愿意,这可以是从另一个堆栈导入的。但为简单起见,我将所有内容都包含在这一套基础设施中。如果您想更深入地了解CDK和GoFunction,这里有一篇文章可以帮助您CDK中的函数定义。exportclassAuthorizerFunctionextendsConstruct{privatereadonly_func:GoFunction;constructor(scope:Construct,id:string,poolId:string){super(scope,id);this._func=newGoFunction(this,"AuthorizerFunc",{entry:path.join(__dirname,`../../../src/authorizer`),functionName:"authorizer-func",timeout:Duration.seconds(30),environment:{USER_POOL_ID:poolId,},});}getfunction():GoFunction{returnthis._func;}}正如我上面提到的,一个简单的GoFunction实现。唯一需要注意的有趣的事情是USER_POOL_ID的环境变量。让我们来看看为什么这很重要。Golang中的函数实现对于这个使用Golang构建自定义API网关授权方的示例,我将验证JWT并添加一些额外的上下文。您的实施可能会有很大不同,这也是我喜欢这种方法的原因。您可以根据需要拥有多个不同的授权者,并且您的受保护资源不知道调用堆栈中在它们之上发生的事情。我想向您展示的第一件事是如何为众所周知的Cognito端点建立密钥集。我在init()函数中这样做是因为我知道它会在Lambda初始化时运行一次,然后我将输出“缓存”在一个变量中,该变量将在Lambda调用中保持自身。不是冷启动,而是调用。funcinit(){log.SetFormatter(&log.JSONFormatter{PrettyPrint:false,})log.SetLevel(log.DebugLevel)region:="us-west-2"poolId:=os.Getenv("USER_POOL_ID")varerrerrorjwksUrl:=fmt.Sprintf("https://cognito-idp.%s.amazonaws.com/%s/.well-known/jwks.json",region,poolId)keySet,err=jwk.Fetch(context.TODO(),jwksUrl)iferr!=nil{log.WithFields(log.Fields{"error":err,"url":jwksUrl,}).Fatal("errorgettingkeyset")}}jwksUrl上面的变量记录在AWS开发人员指南中。我使用来"github.com/lestrrat-go/jwx/jwt"表示KeySet我将使用的来验证令牌的真实性和过期时间。还记得USER_POOL_ID上面CDK中的变量吗?这就是它发挥作用的地方。构建众所周知的端点需要UserPoolId此过程的下一部分是执行验证。我不打算在本文中详细说明这是如何发生的,但本质上图书馆将:验证令牌的结构验证签名密钥与密钥使用的算法匹配验证过期以及令牌尚未过期这就是使用库的好处:)下面是调用它的方法。bounds:=len(event.AuthorizationToken)token:=event.AuthorizationToken[7:bounds]parsedToken,err:=jwt.Parse([]byte(token),jwt.WithKeySet(keySet),jwt.WithValidate(true),)如果上述任何一项失败,的输出jwt.Parse将返回一个。error这意味着在这种情况下,您可以发出拒绝。像这样:returnevents.APIGatewayCustomAuthorizerResponse{PrincipalID:"",PolicyDocument:events.APIGatewayCustomAuthorizerPolicy{Version:"2012-10-17",Statement:[]events.IAMPolicyStatement{{Action:[]string{"execute-api:Invoke"},Effect:"Deny",//HereistherejectionResource:[]string{"*"},},},},UsageIdentifierKey:"",},nil请注意,我没有返回错误。这只是拒绝访问。403响应不是错误,那么为什么要返回一个呢?在一切正常的情况下,只需返回许可即可。returnevents.APIGatewayCustomAuthorizerResponse{PrincipalID:"",PolicyDocument:events.APIGatewayCustomAuthorizerPolicy{Version:"2012-10-17",Statement:[]events.IAMPolicyStatement{{Action:[]string{"execute-api:Invoke"},Effect:"Allow",//ReturnAllowResource:[]string{"*"},},},},Context:DumpClaims(parsedToken),UsageIdentifierKey:"",},nil我还想强调该DumpClaims功能。那有什么作用?Lambda授权器的一项很酷的事情是,您可以将作为“上下文”发送的内容扩展到下游方。如果您想将令牌的一部分带到预定的目的地怎么办?该请求将向JWT发送公开的详细信息,但不会传递私人声明或您扩展的内容。也许是客户ID?也许是一些角色?funcDumpClaims(tokenjwt.Token)map[string]interface{}{m:=make(map[string]interface{})m["customKey"]="SomeValueHere"returnm}对于本文,很简单,我只是customKey在上下文中添加一个。我将很快向您展示它是如何出现的。CDK受保护的资源使用Golang构建自定义API网关授权器的乐趣已经结束了一半。那只是意味着另一半即将开始!现在我们已经有了授权者,我们该怎么办?当然,在它后面放一个受保护的资源!constructor(scope:Construct,id:string,func:IFunction){super(scope,id);constauthorizer=newTokenAuthorizer(this,"TokenAuthorizer",{authorizerName:"BearTokenAuthorizer",handler:func,});this._api=newRestApi(this,"RestApi",{description:"SampleAPI",restApiName:"SampleAPI",deployOptions:{stageName:`main`,},defaultMethodOptions:{authorizer:authorizer,},});}那就是API网关CDK代码。请注意,defaultMethodOptions我正在添加一个“授权者”。这只是一个IFunction.这又可能是一个导入,或者在我们的例子中,它是我们刚刚构建的Authorizer。现在有了API,我们可以创建资源。constructor(scope:Construct,id:string,api:RestApi){super(scope,id);this._func=newGoFunction(this,`ProtectedResource`,{entry:path.join(__dirname,`../../../src/protected-resource`),functionName:`protected-resource-func`,timeout:Duration.seconds(30),});api.root.addMethod("GET",newLambdaIntegration(this._func,{proxy:true,}));}对于我们的示例,我正在使用Lambda代理集成并将其定义在“根”级别。所以我们可以期待“/”路径上的GET请求。这个端点的实际处理程序也是一个简单的演示。funchandler(ctxcontext.Context,eventevents.APIGatewayProxyRequest)(*events.APIGatewayProxyResponse,error){success:=&Response{Message:"Congrats!APayload",CustomKey:event.RequestContext.Authorizer["customKey"].(string),}b,_:=json.Marshal(success)return&events.APIGatewayProxyResponse{Body:string(b),StatusCode:200,Headers:map[string]string{"Content-Type":"application/json",},},nil}customKey注意和的使用event.RequestContext.Authorizer["customKey"].(string)。这个event.RequestContext.Authorizer包含一个`map[string]interface{},您可以利用它来发挥自己的优势。用例是无穷无尽的,但我经常将它用于我扩展的客户详细信息和用户角色以及个人资料数据。把它们放在一起让我们将自定义API网关授权方的输出与Golang放在一起。为此,这里是一起测试这一切的场景。第一件事在引导帐户中:basecdkdeploy创建已知用户部署基础架构后,您应该拥有2个lamda授权人保护资源API网关附有Authoirzer的ProtectedResource的一个端点授权人部署阶段一个已知的用户池这是您的UserPool的外观

使用 Golang 的自定义 API 网关授权方

用户池.注意用户池ID(出于某些原因我已经清除了我的ID)。您需要复制该ID,因为稍后会很重要。

使用 Golang 的自定义 API 网关授权方

现在的客户名单客户名单该表中的ClientID也很重要。同样,我的已经清理干净了,但请注意你的。最后,创建一个用户并将其标记为已验证。

使用 Golang 的自定义 API 网关授权方

创建用户记下他们的密码,因为我们将在一分钟内使用密码流程登录游览API网关对于我们的主要受保护资源,这是它的创建方式

使用 Golang 的自定义 API 网关授权方

受保护的资源Authorization字段指向我们在本文开头定义的BearerTokenAuthorizer。然后在API网关上定义授权者。请记住,如果您使用本文中定义的基本路径映射并共享授权方,则需要为每个API网关附加它。

使用 Golang 的自定义 API 网关授权方

授权方API网关执行请求我们终于准备好运行这个东西了。但首先,让我们获得一个令牌。还记得我说过要捕获UserPool中的ClientID吗?现在是时候把它拿出来了。获取令牌请求

使用 Golang 的自定义 API 网关授权方

这个的输出将是你的三个令牌。访问令牌身份证刷新令牌请随意在下一个请求中使用ID或Access。发出请求很简单。失败请求首先,让我们看看BadToken会发生什么

使用 Golang 的自定义 API 网关授权方

错误的请求您在CloudWatch中的日志应如下所示失败Cloudwatch

使用 Golang 的自定义 API 网关授权方

请求成功现在为了成功!

使用 Golang 的自定义 API 网关授权方

您在CloudWatch中的日志应如下所示失败Cloudwatch

使用 Golang 的自定义 API 网关授权方

你做到了!使用示例事件在本地测试如果我不包括您也可以对授权方进行一些本地测试,那将是我的疏忽。这可以通过两种方式发生一些单元测试使用测试事件文件运行本地文件如果您在此堆栈上本地执行,您将在目录中cdksynth得到一个。您可以像这样运行存储库中包含的测试文件MainStack.template.jsoncdk.outbashsamlocalinvokeAuthorizerFunc-tcdk.out/MainStack.template.json--eventsrc/authorizer/test-events/e-1.json--env-varsenvironment.json--skip-pull-image总结那是一篇包含很多细节的长文章,但在使用无服务器技术构建安全且可扩展的API时,这种模式非常有用。通过使用Golang添加自定义API网关授权器,您可以在堆栈的高层捕获此授权逻辑,从而节省下游资源,使其不必处理此重复代码。此外,但利用事件上下文到您的下游Lambda,您可以使用您可能已自定义的PrivateClaims。

举报/反馈

以上内容为资讯信息快照,由td.fyun.cc爬虫进行采集并收录,本站未对信息做任何修改,信息内容不代表本站立场。

快照生成时间:2023-05-08 19:45:42

本站信息快照查询为非营利公共服务,如有侵权请联系我们进行删除。

信息原文地址:

...动态令牌系统读多写少的业务特性,自主设计并研发路由网关组件,实现新系统异地双活设计,确保在主中心发生故障时能通过异地副中心快速接管服务,大幅提升系统可用性和业务连续性。此外,
2024-10-21 22:37:00
为什么使用 Kong API 网关
KongAPIGateway是一个基于Nginx反向代理的云原生API网关。它是一种简单、快速且轻量级的解决方案,使您能够控制
2023-04-23 15:40:00
物联网产品中,经常提到的终端、网关、协议、PaaS、SaaS之间,到底有什么关系?
在互联网产品中,经常提到的终端、网关、协议、PaaS、SaaS之间,到底有什么关系呢?本文作者分享了互联网中频繁出现的一些词汇,以及为初入物联网行业的同学整理了一些坑,希望能给你
2023-05-14 19:00:00
边缘计算网关促进了智能制造和工业自动化的实现
边缘计算网关作为工业互联网系统中的关键设备,具有以下功能和优势:功能1.数据采集:边缘计算网关可以从各种传感器、设备和系统中收集数据,支持多种通信协议和接口,如Modbus、OP
2024-07-28 07:55:00
共织可编程未来|锐捷网络首届NPL可编程网络技术研讨会
...俱全,整合了一个小型数据中心的业务需求,需要部署边缘网关设备同时支持专线接入、VPN、NAT、LB等功能;另一方面,人工智能生成内容的爆火也驱动了智算中心的高速发展,大批量用
2023-05-10 03:00:00
三未信安安全网关 SecGW 通过IPv6 Ready Logo认证
近日,三未信安科技股份有限公司旗下安全网关 SecGW 在下一代互联网国家工程中心-全球IPv6测试中心正式通过IPv6 Ready核心协议Phase-2测试
2023-07-14 11:00:00
沪市交易网关流速费暂免,助力市场轻装上阵
...责任公司决定暂免收取2024年1月22日至11月30日期间的交易网关流速费,后续具体收取时间将另行通知。公开信息显示,交易网关流速费是指交易所在特定情境下向会员收取的一种费用
2024-09-29 10:54:00
支持WiFi/以太网/4G上传,MG6 4G 蓝牙云桥网关重磅上市!
...场景的不断拓展与深化,一系列问题也逐渐浮出水面。以网关为例,物联网设备数量的激增对网关的覆盖范围提出了更高要求;同时,面对日益复杂的作业环境,网关也需具备更强的网络稳定性;此
2024-11-23 14:18:00
“星火网关”正式发布,助力“星火·链网”应用体系全面进阶
...究院的牵头下,“星火·链网”对外服务连接器——星火网关正式对外发布。作为国家级区块链网络“星火·链网”的重要组成部分,星火网关的上线将极大地降低外界使用“星火·链网”的门槛,
2024-06-21 11:45:00
更多关于科技的资讯:
十堰广电讯(全媒体记者 耿吉国)据2025新能源汽车零部件交易会组委会最新消息,9月21日10:30,本届交易会将在十堰国际会展中心的交易会活动现场
2025-09-21 08:54:00
9月20日,2025太原人形机器人欢乐跑比赛在晋阳湖公园举行。这是我市第一次举办人形机器人“跑步”比赛。本次比赛,共有来自省城高校
2025-09-21 06:42:00
混成全网公敌的“流水线式造假”,终于被整顿
一家三口站在某所知名小学校门前,松弛地拍了一张合照。照片发到小红书上,下方评论区都在问询:“这么优秀的娃,究竟该怎么培养
2025-09-20 22:18:00
家庭观影进入IMAX时代!海信发布全球最大150英寸激光电视
鲁网9月19日讯9月19日,以“无界”为主题的“2025激光显示技术与产业发展大会”隆重举行。作为全球激光显示领域的领军企业
2025-09-20 08:56:00
我国脑机接口技术取得重大突破 厦门大学研究人员参与
放大镜视野下的“神经蠕虫”电极。(受访者 供图)厦门网讯(厦门日报 佘峥 通讯员 戴佩琪)我国脑机接口技术有重大突破——近日
2025-09-20 09:18:00
厦门“屏实力”再添新动能 天马发布高端OLED技术品牌“天工屏”
图为天马“天工屏”发布会现场。(厦门日报记者 卢剑豪 摄)厦门网讯(厦门日报记者 林露虹 通讯员 雷飏 李舜)随着人们日常使用手机时长持续攀升
2025-09-20 09:18:00
“赢在南京”海外人才创业大赛总决赛落幕逐鹿未来机“慧” 四海英才“论剑”南报网讯(记者余梦娇)9月19日,2025年“赢在南京”海外人才创业大赛总决赛在紫金山科技城圆满落幕
2025-09-20 09:54:00
过节送福礼,就送波尼亚!老字号中秋礼盒,青岛人都认这口
鲁网9月20日讯中秋将至,岛城的节日氛围日渐浓厚,走亲访友、阖家团聚的时刻,一份饱含心意的礼品总能传递温暖。作为扎根青岛的老字号肉食品牌
2025-09-20 10:08:00
机器人“总动员”!2025世界制造业大会上演智造奇观
大皖新闻讯 机械臂在空中划出优美弧线,人形机器人灵活抓取糖果,机器狗稳步行走在模拟街区内……2025世界制造业大会的智能机器人展区仿佛穿越至未来世界
2025-09-20 13:25:00
茶话弄九周年,这款经典单品即将迎来“家族式”升级
9月的西安,金桂飘香。2016年创立于西安的国风新中式茶饮品牌茶话弄,也将于近期启动以“桂花”为主题元素的品牌九周年庆典系列活动
2025-09-20 15:33:00
了不起的河南制造丨汉威科技:唤醒机器人“感知”世界的能力
大河网讯 2025世界制造业大会9月20日至23日在安徽省合肥市举办,大会以“智造世界·创造美好”为主题,举办开幕式暨主旨演讲
2025-09-20 16:14:00
了不起的河南制造丨2025世界制造业大会举行,河南“工业机器人”现场秀签名
大河网讯 9月20日,2025世界制造业大会开幕式暨主旨演讲在合肥市举行。河南省作为主宾省参会,30家制造业企业“重装上阵”
2025-09-20 16:45:00
2026届校园招聘大战启幕 科技企业派机器狗进高校抢人
近期,2026届校园招聘在全国多所高校陆续启动,一场围绕科技人才的“抢人大战”正式拉开帷幕。与往年相比,今年众多科技企业积极创新招聘形式
2025-09-20 17:55:00
2025山东省“产业大脑”建设工作推进会暨第五届中国(国际)美妆睫毛产业博览会在平度盛大启幕
鲁网9月20日讯(记者 潘亚妮 实习记者 刘悦 通讯员 袁嘉利 位一凡)9月20日,2025山东省“产业大脑”建设工作推进会暨第五届中国(国际)美妆睫毛产业博览会在平度市美妆在线新经济产业园盛大启幕
2025-09-20 17:55:00
从“炕头经济”到“美丽经济” ,平度睫毛产业数字化蝶变升级
齐鲁晚报•齐鲁壹点 刘震 通讯员 袁嘉利 位一凡9月20日,2025山东省“产业大脑”建设工作推进会暨第五届中国(国际)美妆睫毛产业博览会在平度市开幕
2025-09-20 18:05:00