• 我的订阅
  • 科技

使用 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
更多关于科技的资讯:
以下为报道原文:从“猜你喜欢”到“懂你需要” 人工智能加速“嵌入”日常生活人民日报 记者 谷业凯“帮我订春节假期南京到三亚的往返机票
2026-02-18 17:52:00
重要突破!中国科大发现新型有序物态——理想非晶体
大皖新闻讯 2月18日,大皖新闻记者从中国科学技术大学获悉,该校童华教授、徐宁教授及其合作者在非晶物态理论研究中取得重要突破
2026-02-18 17:53:00
新岁启程,马蹄声疾。骉(biāo),《说文解字》解读为“众马也”。单从字形便觉气势如虹,三马叠加,并辔而行。从一马当先
2026-02-18 14:39:00
以“兴趣”为引,开启银龄健康生活新方式:简橙太极如何助力科学养生、乐享晚年
在当今社会,随着健康老龄化的理念日益深入人心,越来越多的中老年人开始积极追求丰富多彩的退休生活和身心和谐的健康状态。这一趋势催生了对优质
2026-02-18 12:53:00
【网络中国节·春节】AI机器人带来新春消费新体验 带旺厦门文旅市场
AI机器人带来新春消费新体验厦门通过AI赋能打造新业态新场景,带旺假期文旅消费市场市民游客观看机器人咖啡师制作咖啡。(夏商咖啡供图)厦门网讯(厦门日报记者 沈彦彦 王元晖)厦门中山路“两岸数智非遗年”现场
2026-02-18 09:55:00
全力保交付 海辰储能厦门基地春节期间维持满负荷生产
位于同翔高新城的海辰储能厦门基地春节期间——满负荷生产 全力保交付春节期间,海辰储能满负荷生产。(厦门日报记者 卢剑豪 摄)厦门网讯(厦门日报记者 林露虹)大年初一
2026-02-18 10:26:00
成功捕获到约6500光年外的宇宙线信号网通院参研的LACT首台望远镜完成“首光”河北新闻网讯(河北日报记者王璐丹)近日
2026-02-18 07:58:00
2026年央视马年春晚,成为机器人扎堆亮相的“超级秀场”。而最牵动人心的,当属杭州宇树科技机器人与河南塔沟武术学校的小朋友同台呈现的节目《武BOT》
2026-02-18 07:04:00
2026年央视春晚演出现场,观众席间不少人佩戴的红围巾火了。微博上有网友实时提问:哪里能买到同款?这条名为“骐骥驰骋”的红围巾
2026-02-18 07:04:00
杭州智造“飞”上春晚 全球首次极寒载人飞行惊艳哈尔滨
图为央视春晚哈尔滨分会场彩排画面。除夕夜,央视春晚哈尔滨分会场以精彩的《冰雪暖世界》演出,带来了属于“冰城”的浪漫和温暖
2026-02-18 07:04:00
宇树春晚的表演,创下至少五个全球第一
网友热议“浙江黑科技” “太硬核了”“不愧是诞生‘六小龙’的地方”当虹科技8K超高清编码技术支持下,演员衣服上的刺绣纹理清晰可见
2026-02-18 07:34:00
豆包除夕AI互动19亿次 Seedance2.0为春晚提供技术支持
河北新闻网讯(记者 李春炜)2月16日,字节跳动旗下AI助手豆包与央视总台春晚联动,面向全国观众送出10万份科技好礼,并推出多项AI互动玩法
2026-02-17 20:35:00
中新经纬2月17日电 千问App数据显示,春节活动期间,全国超过1.3亿人第一次体验AI购物,说了50亿次“千问帮我”
2026-02-17 14:16:00
新春走基层|港口老司机“秀”新操作
2月16日,秦港股份九公司集控中心操作员曹宏璐在工作中。河北日报记者 张辉摄2月16日,农历除夕。下午2时30分许,随着“航旭鑫海”轮进入秦皇岛港902泊位
2026-02-17 08:53:00
1.3亿人春节首次体验AI购物,千问一跃成为国民级AI助手
2月17日大年初一凌晨,千问发布的数据显示,春节活动期间,全国超过1.3亿人第一次体验AI购物,说了50亿次“千问帮我”
2026-02-17 10:22:00