乐趣区

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

这篇文章本来 Jerry 只在 SAP 社区上写了英文版的,可以通过点击文末的“阅读原文”获得。后来有两位做 Marketing Cloud 开发的德国同事,写邮件询问关于文章的更多细节,声称这种方式对他们自己的 API 性能测试很有用,所以我觉得还是值得用中文再写一遍。

在 SAP 官网 api.sap.com 里有大量发布的 API,方便合作伙伴和客户自开发应用同 SAP 解决方案进行集成。

比如 Jerry 上个月做的一个项目,就是和国内一家专注于提供人脸识别技术解决方案的企业合作, 用户通过微信扫码从而完成人脸识别后,在用户授权的情况下,会调用 SAP Marketing Cloud 的 contact API,生成对应的 contact 数据,并且将人脸识别得出的面部特征码通过 Marketing Cloud 扩展字段的方式一并存入 contact 数据中。

因为这个项目最后会在 2019 年 6 月 5 日于上海举行的 SAP 云大会上展示,所以当时 Jerry 完成集成工作后心想,还是得提前测试一下咱们的 Marketing Cloud 在响应并发请求时的性能, 做到心里有数。

我们在 SAP 上海云大会上演示的场景是,将 SAP Marketing Cloud 的 Launchpad 通过大屏幕投影出来,参会嘉宾完成人脸识别后,Marketing Cloud contact 创建 API 自动被调用,在系统生成 contact 数据,并且 Launchpad contact tile 的计数器加一。


所以下一步就是如何模拟大量对 Marketing Cloud API 的并发请求。

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

https://github.com/i042416/Ja…

除了自己动手编写代码外,还可以重用一些 API 测试工具来达到同样的目的。Postman 是一个 API 开发人员常用的接口调试利器,它也有定义变量和简易的编程功能:

可以通过称之为 Collection Runner 的功能,一键运行 Collection 里的多个请求。

Jerry 在这篇 SAP 社区博客里详细介绍过 Postman 的编程:

Just a single click to test SAP OData Service which needs CSRF token validation
https://blogs.sap.com/2019/06…

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

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

总的思路就是使用 jMeter 提供的 Thread Group(线程组)和控制器这两个工具。Thread Group 帮助工具使用者实现了通过多线程发送 HTTP 请求的功能,比如下图设定的 100,意思是通过 100 个线程同时发送请求。

而涉及到对系统进行写操作的 SAP API,比如新建,修改或者删除数据的 SAP OData 服务,在请求的 HTTP 头部必须附带防止跨域请求伪造攻击的 CSRF token(有时又称 XSRF token:Cross-site request forgery). 我们可以将从服务器获取 CSRF token 的请求和真正调用 contact API 的请求放到同一控制器里,这样能确保同一线程内,拿 token 和创建 contact 这两个请求依次执行。

SAP 云平台的官网上有一个帮助文档,对用户访问 SAP 云平台上的服务的 Authentication 流程做了清晰的阐述:

https://cloudplatform.sap.com…

这张图描述了在 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 流程。

  1. 浏览器打开 SAP Marketing Cloud Fiori Launchpad 链接,HTTP 请求发送到了 Marketing Cloud 系统,后者可以视为 Service Provider。
  2. Marketing Cloud 把请求通过 HTTP 302 重定向了它预先配置好的 IdP 上去,即 SAP ID service(也就是 account.sap.com).

关于什么是 SAP ID service,可以查看 SAP 官方帮助文档:

https://help.sap.com/viewer/6…

  1. IdP 的职责是完成实际的用户认证工作,它给用户返回一个登录页面,要求其输入用户名和密码。

上图显示的是 SAP ID Service 的登录页面,UI 虽然简单,但是这个页面的源代码里存在很多隐藏字段。

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

xsrfProtection
spId
spName
authenticity_token
idpSSOEndpoint

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

  1. 用户输入密码点击登录按钮后,用户输入的用户名和密码,同第三步介绍的登录页面的隐藏字段,会一齐返回给 SAP ID Service 服务端。可以在 Chrome 开发者工具里观察到这些字段位于 HTTP 请求头部。

  1. IdP 完成用户认证,颁发一个 ”assertion” 响应,值存储于 HTTP 响应头部的 SAMLResponse 字段里。

这个字段的 SAML 表明这是一个基于 SAML 协议的认证过程,把上图 Chrome 开发者工具里观察到的 SAMLResponse 字段值通过 BASE64 解码,得到下图的 XML 格式的 assertion 内容:

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

SAML 协议规范的官方文档:

http://saml.xml.org/saml-spec…

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

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

https://github.com/i042416/Kn…

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

  1. 使用 jMeter 提供的正则表达式提取器,将认证流程第 3 个步骤,IdP 返回的登录页面的 5 个隐藏字段的值提取出来,存储成 jMeter 变量:

下图显示了这些隐藏字段的值被成功提取出来并存储成 jMeter 变量:

  1. 把第一步提取出并存储在 jMeter 变量中的五个字段的值 (下图红色) 的值,再加上用户手动输入的用户名和密码(下图蓝色), 作为请求的头部字段,一齐提交给 SAP ID service:

登录成功后,收到了服务器端返回的 Cookie 值:

  1. 发送新的请求给服务器,获取 CSRF token. 这个请求的响应里包含了两个下图高亮的 Cookie,需要同样存储成 jMeter 变量,以供最后一个请求使用。

  1. 最后一个步骤,将前一步获取到的 CSRF token 附加到 HTTP 请求字段中,同时带上前一步服务器返回的两个 Cookie 字段:

至此这个 jMeter 项目的配置工作就完成了,其优于 Java 编程和 Postman 之处在于我们不需要编写一行代码,我们对 API 进行并发测试这个需求的相关功能点全部能够通过 jMeter 里的配置完成。

最后简单测试一下并发请求的响应时间:

我在使用 jMeter 调用 contact API 创建工作时用到了简单的随机数生成器,在 contact 的姓后面加上了简单的随机数,这是最后通过 jMeter 生成的 contact 在 Marketing Cloud 里的显示:

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

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

要获取更多 Jerry 的原创文章,请关注公众号 ” 汪子熙 ”:

退出移动版