热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AWSAPIGateway的简介与使用

APIGateway的简介AmazonAPIGateway是一种完全托管的服务,可以帮助开发者轻松创建、发布、维护、监控和保护任意规模的API。APIGateway负责管理所有任务

API Gateway的简介

Amazon API Gateway 是一种完全托管的服务,可以帮助开发者轻松创建、发布、维护、监控和保护任意规模的 API。API Gateway 负责管理所有任务,涉及接受和处理成千上万个并发 API 调用,包括流量管理、授权和访问控制、监控以及 API 版本管理。API Gateway 没有最低费用或启动成本。您只需为您收到的 API 调用和传出的数据量付费,使用 API Gateway 分级定价模式,随着 API 使用规模的增加,您可以减少花费。


API Gateway的方法请求和集成请求映射

https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/request-response-data-mappings.html

1)默认映射方式,URL POST方法 request body可以默认传到lambda的event,可以看到方法请求体中的两个参数被传递到了lambda中作为参数


2)Get 方法传递Url Parma传递映射,通过设置方法请求和集成请求,将Url Parma作为lambda的参数,其中用到了Velocity 模板语言 (VTL) 

方法请求中设置URL查询字符串参数


集成请求中设置URL查询字符串参数,映射模板参数配置


可以看到通过URL的参数groupName值'aaa'已经可以传到lambda的参数中了


3)Url header的信息映射,通过集成请求传递作为请求体传到lambda的参数中

https://amazonaws-china.com/cn/premiumsupport/knowledge-center/custom-headers-api-gateway-lambda/?nc1=h_ls

集成请求中配置映射模板取得url header中的各个键值对


可以看到,LAMBDA已经获取了Url header的authorization的JWT token


代码中可以使用这个JWT token进行相应的业务逻辑的处理,判断token的合法性和过期,还有相应的权限,等等..


4)Url path parma的映射,通过设置方法请求和集成请求,将Url param作为lambda的参数

集成请求中配置映射模板取得url参数id的值


可以看到url中的id值1,已经可以在lambda中取到了



API Gateway的方法响应和集成响应映射

有时候需要在项目中的API Gateway自定义一些header的信息返回,可以在集成响应和方法响应中定义一些header的键值对


在集成响应中定义值


重新部署API GW,打开网站,查看对应的API GW,可以看到自定义的header已经成功加上去了



创建API GW的授权方

可以自定义API GW的授权,对于API GW进行安全限制

创建新的lambda , 自定义授权机制,判断token的合法性和过期,还有相应的权限,等等..,注意返回格式一定要符合IAM policy的要求

exports.handler =  function(event, context, callback) {

    var token = event.authorizationToken;

    var tokenInvalidReason;

    if (token == null || token == undefined || token == ''){

            callback("Unauthorized");

    }

    else{

        var token = event.authorizationToken;

        if( token.indexOf("Bearer ") > -1){

            token = token.substring(7);

            var array = token.split('.');

            console.log("array length",array.length);

            if(array.length > 2){

                token = array[1];

            }

            console.log('token is: ' + token);

        }

        const hash = new Buffer(token, 'base64').toString();

        console.log('analysis base auth hash is: ' + hash);

        var authObj = JSON.parse(hash);

        if (!authObj.scope){

            callback("Unauthorized");

        }

        if(authObj.scope.indexOf('read_snfa_air') != -1) {

             callback(null, generatePolicy('user', 'Allow',event.methodArn,"xxx.xx.x"));

        }

        if (authObj.scope.indexOf('read_xxxx_profile') == -1){

            callback("Unauthorized");

        }

        var now = parseInt(Date.now() / 1000);

        console.log("Expired time in token",authObj.exp);

        console.log("Current time",now);

        if (authObj.exp
            console.log("Token Expired");

            callback("Token Expired");

        }

        var eid = authObj.samaccount_name;

        //event.eid = eid;

        //console.log(generatePolicy('user', 'Allow',event.methodArn));

        callback(null, generatePolicy('user', 'Allow',event.methodArn,eid));

    }

  

};

// Help function to generate an IAM policy

var generatePolicy = function(principalId, effect,resource,eid) {

    var authRespOnse= {};

    //authResponse.eid = "steven.rui.zhang";

    authResponse.principalId = principalId;

    //authResponse.eid = eid;

    if (effect && resource) {

        var policyDocument = {};

        policyDocument.Version = '2012-10-17'; 

        policyDocument.Statement = [];

        var statementOne= {};

        statementOne.Action = 'execute-api:Invoke'; 

        statementOne.Effect = effect;

        statementOne.Resource = resource;

        policyDocument.Statement[0] = statementOne;

        authResponse.policyDocument = policyDocument;

    }

    

    // Optional output with custom properties of the String, Number or Boolean type.

    authResponse.cOntext= {

        'eid' : eid

    };

    return authResponse;

}

在API GW中新建授权方,绑定上述的lambda


对于需要使用授权的API GW 方法请求中配置授权



处理 API Gateway 中的 Lambda 错误

https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html

对于 Lambda 自定义集成,您必须将在集成响应中由 Lambda 返回的错误映射到客户端的标准 HTTP 错误响应。否则,Lambda 错误会默认返回为 200 OK 响应,并且结果对于您的 API 用户而言并不直观。

在方法响应中定义HTTP状态,然后再集成响应中定义Lambda错误正则表达式



推荐阅读
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 微信平台通过盛派SDK(sdk.weixin.senparc.com)允许服务号和订阅号使用appId和token读取关注用户的个人信息。然而,这一过程需严格遵守隐私保护和数据安全的相关规定,确保用户数据的安全性和隐私性。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本文详细解析了微信服务端示例类的功能与应用。其中,`ClientResponseHandler` 类主要用于处理微信支付所需的响应数据,而 `TenpayHttpClient` 则是对 HTTP 请求(包括 GET 和 POST 方法)进行了封装,以便在内部调用时更加便捷和高效。这些工具类在实际开发中起到了关键作用,开发者无需深入了解其底层实现细节,即可轻松集成微信支付功能。 ... [详细]
author-avatar
手机用户2602889771
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有