使用jMeter对基于SAP ID service进行Authentication的Restful API进行并发测试

简介: 使用jMeter对基于SAP ID service进行Authentication的Restful API进行并发测试

这篇文章本来Jerry只在SAP社区上写了英文版的,后来有两位做Marketing Cloud开发的德国同事,写邮件询问关于文章的更多细节,声称这种方式对他们自己的API性能测试很有用,所以我觉得还是值得用中文再写一遍。image.png在SAP官网api.sap.com里有大量发布的API,方便合作伙伴和客户自开发应用同SAP解决方案进行集成。image.png比如Jerry上个月做的一个项目,就是和国内一家专注于提供人脸识别技术解决方案的企业合作, 用户通过微信扫码从而完成人脸识别后,在用户授权的情况下,会调用SAP Marketing Cloud的contact API,生成对应的contact数据,并且将人脸识别得出的面部特征码通过Marketing Cloud扩展字段的方式一并存入contact数据中。


因为这个项目最后会在2019年6月5日于上海举行的SAP云大会上展示,所以当时Jerry完成集成工作后心想,还是得提前测试一下咱们的Marketing Cloud在响应并发请求时的性能, 做到心里有数。image.png我们在SAP上海云大会上演示的场景是,将SAP Marketing Cloud的Launchpad通过大屏幕投影出来,参会嘉宾完成人脸识别后,Marketing Cloud contact创建API自动被调用,在系统生成contact数据,并且Launchpad contact tile的计数器加一。image.pngimage.png所以下一步就是如何模拟大量对Marketing Cloud API的并发请求。


对于程序员来说,最容易想到的方式就是自己动手写一个程序来发送大量请求。Jerry选择的最简单的编程方式,在Java程序里新建大量线程,每个线程发送一个请求,当然也可以直接用JDK里提供的线程池库。我的Java程序源代码在github上:


https://github.com/i042416/JavaTwoPlusTwoEquals5/tree/master/src/odata


除了自己动手编写代码外,还可以重用一些API测试工具来达到同样的目的。Postman是一个API开发人员常用的接口调试利器,它也有定义变量和简易的编程功能:image.png可以通过称之为Collection Runner的功能,一键运行Collection里的多个请求。image.pngJerry在这篇SAP社区博客里详细介绍过Postman的编程:


Just a single click to test SAP OData Service which needs CSRF token validation

https://blogs.sap.com/2019/06/10/sap-just-a-single-click-to-test-sap-odata-service-which-needs-csrf-token-valid/


Jerry还在成都C4C开发团队时,组内同事就告诉过我,jMeter是另一个功能强大的基于Java的API压力测试工具。所以这次我选择用jMeter来对API做压力测试。


下文介绍的内容需要大家对jMeter的使用有最基本的了解,如果还不太熟悉的朋友,可以先查阅jMeter的官方文档。


总的思路就是使用jMeter提供的Thread Group(线程组)和控制器这两个工具。Thread Group帮助工具使用者实现了通过多线程发送HTTP请求的功能,比如下图设定的100,意思是通过100个线程同时发送请求。image.png而涉及到对系统进行写操作的SAP API,比如新建,修改或者删除数据的SAP OData服务,在请求的HTTP头部必须附带防止跨域请求伪造攻击的CSRF token(有时又称XSRF token:Cross-site request forgery). 我们可以将从服务器获取CSRF token的请求和真正调用contact API的请求放到同一控制器里,这样能确保同一线程内,拿token和创建contact这两个请求依次执行。image.pngSAP云平台的官网上有一个帮助文档,对用户访问SAP云平台上的服务的Authentication流程做了清晰的阐述:

https://cloudplatform.sap.com/scenarios/usecases/authentication.htmlimage.png这张图描述了在Authentication场景下,几个名词User(有时称为Client), Service Provider和Identity Provider(途中简写成IdP)的相互作用关系。


虽然Jerry本文介绍的场景,我用jMeter消费的是Marketing Cloud上的服务,而非SAP云平台上的服务,不过这些服务对应的Idp都是SAP ID service,即accounts.sap.com, 因此Authentication原理仍然相同。


我们牢牢记住这张图的几个步骤,因为我们接下来用jMeter消费Marketing Cloud API时,同样要遵循这种Authentication流。


我们先用Chrome访问SAP Marketing Cloud Fiori Launchpad,来深入理解图中介绍的Authentication流程。


浏览器打开SAP Marketing Cloud Fiori Launchpad链接,HTTP请求发送到了Marketing Cloud系统,后者可以视为Service Provider。


Marketing Cloud把请求通过HTTP 302重定向了它预先配置好的IdP上去,即SAP ID service(也就是account.sap.com).image.png关于什么是SAP ID service,可以查看SAP官方帮助文档:


https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/d6a8db70bdde459f92f2837349f95090.html


IdP的职责是完成实际的用户认证工作,它给用户返回一个登录页面,要求其输入用户名和密码。image.pngimage.png上图显示的是SAP ID Service的登录页面,UI虽然简单,但是这个页面的源代码里存在很多隐藏字段。

用Chrome开发者工具能够发现这些隐藏字段:image.pngxsrfProtection

spId

spName

authenticity_token

idpSSOEndpoint


这些字段都是在SAP ID Service的服务器端生成,然后返回给客户端。


用户输入密码点击登录按钮后,用户输入的用户名和密码,同第三步介绍的登录页面的隐藏字段,会一齐返回给SAP ID Service服务端。可以在Chrome开发者工具里观察到这些字段位于HTTP请求头部。image.pngdP完成用户认证,颁发一个"assertion"响应,值存储于HTTP响应头部的SAMLResponse字段里。image.png这个字段的SAML表明这是一个基于SAML协议的认证过程,把上图Chrome开发者工具里观察到的SAMLResponse字段值通过BASE64解码,得到下图的XML格式的assertion内容:

image.png上图第一处用红色矩形框高亮的字段是assertion的状态,值为success. 因为SAP ID Service和Marketing Cloud系统配置为互相信任,所以这意味着SAP ID Service通知Marketing Cloud,这个用户的认证已经通过了。


SAML协议规范的官方文档:


http://saml.xml.org/saml-specifications


有了上述的理论基础后,进行jMeter项目的配置工作思路也就清楚了。


我把jMeter项目的工程文件放到我的Github上了,方便大家重用:


https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/C4COData/jMeter/01-contact-creation.jmx


在jMeter里,我们按照SAP官网认证架构图的6个步骤来配置image.png

  1. 使用jMeter提供的正则表达式提取器,将认证流程第3个步骤,IdP返回的登录页面的5个隐藏字段的值提取出来,存储成jMeter变量:image.png下图显示了这些隐藏字段的值被成功提取出来并存储成jMeter变量:image.png把第一步提取出并存储在jMeter变量中的五个字段的值(下图红色)的值,再加上用户手动输入的用户名和密码(下图蓝色), 作为请求的头部字段,一齐提交给SAP ID service:image.png登录成功后,收到了服务器端返回的Cookie值:image.png发送新的请求给服务器,获取CSRF token. 这个请求的响应里包含了两个下图高亮的Cookie,需要同样存储成jMeter变量,以供最后一个请求使用。

image.png

  1. 最后一个步骤,将前一步获取到的CSRF token附加到HTTP请求字段中,同时带上前一步服务器返回的两个Cookie字段:image.png至此这个jMeter项目的配置工作就完成了,其优于Java编程和Postman之处在于我们不需要编写一行代码,我们对API进行并发测试这个需求的相关功能点全部能够通过jMeter里的配置完成。image.png最后简单测试一下并发请求的响应时间:image.png我在使用jMeter调用contact API创建工作时用到了简单的随机数生成器,在contact的姓后面加上了简单的随机数,这是最后通过jMeter生成的contact在Marketing Cloud里的显示:

image.png最后一步就是把SAP Marketing Cloud Launchpad里的contact tile的计数器刷新间隔设置成10秒刷新一次:

image.png系统显示,在2019年6月5日上海SAP云大会这个演示场景的展台上,一共有276个嘉宾完成了人脸识别后的Marketing Cloud contact注册流程。image.png



相关文章
|
15天前
|
API 网络架构 UED
构建RESTful API的最佳实践
【8月更文挑战第54天】在数字化时代,RESTful API已成为连接不同软件系统、提供数据服务的关键桥梁。本文将深入探讨如何构建高效、可维护的RESTful API,涵盖设计原则、安全策略和性能优化等关键方面。通过具体代码示例,我们将一步步展示如何实现一个简洁、直观且功能强大的API。无论你是新手还是有经验的开发者,这篇文章都将为你提供宝贵的指导和启示。
67 33
|
2天前
|
存储 JSON JavaScript
探索后端开发:从零构建简易RESTful API
【9月更文挑战第35天】在数字时代的浪潮中,了解如何搭建一个后端服务变得至关重要。本文将通过构建一个简易的RESTful API来揭开后端开发的神秘面纱。我们将使用Node.js和Express框架,逐步引导你理解并实践API的设计、实现与测试过程。无论你是编程新手还是希望扩展技能边界的开发者,这篇文章都将为你提供一次深入浅出的学习旅程。
|
5天前
|
XML JSON API
深入浅出:RESTful API 设计实践与最佳应用
【9月更文挑战第32天】 在数字化时代的浪潮中,RESTful API已成为现代Web服务通信的黄金标准。本文将带您一探究竟,了解如何高效地设计和维护一个清晰、灵活且易于扩展的RESTful API。我们将从基础概念出发,逐步深入到设计原则和最佳实践,最终通过具体案例来展示如何将理论应用于实际开发中。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的指导和灵感。
|
4天前
|
API 开发者 UED
构建高效RESTful API的最佳实践
【9月更文挑战第33天】在数字化时代,后端开发不仅仅是关于代码的编写。它是一场架构艺术的演绎,是性能与可维护性之间的舞蹈。本文将带你深入理解RESTful API设计的精髓,探索如何通过最佳实践提升API的效率和可用性,最终实现后端服务的优雅蜕变。我们将从基础原则出发,逐步揭示高效API设计背后的哲学,并以实际代码示例为路标,指引你走向更优的后端开发之路。
|
10天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
11天前
|
缓存 监控 测试技术
深入理解RESTful API设计原则与最佳实践
【9月更文挑战第26天】在数字化时代,API(应用程序编程接口)已成为连接不同软件和服务的桥梁。本文将深入浅出地介绍RESTful API的设计哲学、六大约束条件以及如何将这些原则应用到实际开发中,以实现高效、可维护和易于扩展的后端服务。通过具体实例,我们将探索如何避免常见设计陷阱,确保API设计的优雅与实用性并存。无论你是API设计的新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的指导和启示。
|
14天前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
39 3
|
14天前
|
存储 前端开发 API
告别繁琐,拥抱简洁!Python RESTful API 设计实战,让 API 调用如丝般顺滑!
在 Web 开发的旅程中,设计一个高效、简洁且易于使用的 RESTful API 是至关重要的。今天,我想和大家分享一次我在 Python 中进行 RESTful API 设计的实战经历,希望能给大家带来一些启发。
30 3
|
13天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
35 1
|
15天前
|
JSON API 开发者
惊!Python Web开发新纪元,RESTful API设计竟能如此性感撩人?
在这个Python Web开发的新纪元里,RESTful API的设计已经超越了简单的技术实现,成为了一种追求极致用户体验和开发者友好的艺术表达。通过优雅的URL设计、合理的HTTP状态码使用、清晰的错误处理、灵活的版本控制以及严格的安全性措施,我们能够让RESTful API变得更加“性感撩人”,为Web应用注入新的活力与魅力。
34 3
下一篇
无影云桌面