编者注:

本文为公众号博主 Wolfberry 的原创文章。

原文链接:

https://mp.weixin.qq.com/s/4Nj8isNI2l0zInqxSDsvvw

本文将分享在 MeterSphere 开源持续测试平台中如何通过 Shell 生成 Signature 签名,并实现对 MeterSphere API 的调用操作。

最近在将 MeterSphere 与 DevOps 的 CI/CD 集成起来,主要是通过 CI/CD 流水线触发 MeterSphere 中的自动化接口用例和场景用例,第一步需要解决调用 API 所涉及的鉴权认证。

对于 Java 的实现,可以参考公众号文章:《在 MeterSphere 中使用预执行脚本功能生成接口认证签名》(https://blog.fit2cloud.com/?p=1489MeterSphere)。然而在有些情况下,对 API 的调用需要通过 Shell 脚本来实现,即通过 Shell 生成 Signature 签名并调用接口。

根据上面链接中文章的描述,在通过 API 调用 MeterSphere 接口时,需要在请求头中传入 accessKey 和 Signature。其中,accessKey 为创建 API Key 时生成的 Access Key,Signature 通过如下加密算法得出:

通过 Shell 生成 Signature

除了上述方法,我们还可以通过 Shell 来生成 Signature。对于 Shell,显然没有高级语言那样有丰富的类库,但 Shell 也能通过丰富的 Linux 命令和工具实现复杂的功能。对于本案例,可以利用 OpenSSL 命令生成该加密签名:

openssl enc -e -aes-128-cbc -base64 -K <加密密钥> -iv <加密向量>

另外,Shell 也能十分便捷地用一条命令就能得到加密字符串所需的 13 位 Unix 时间戳,用符号 “|” 将 accessKey 与 Unix 时间戳连接起来,就可以得到加密字符串。

操作示例

根据指定的 MeterSphere 项目名称,返回相应的项目 ID:

■ 传入 accessKey、secretKey、projectName 和 MeterSphere 服务器地址,实时生成 Signature:

################## Sample script ######################
#!/bin/bash
accessKey=$1
secretKey=$2
projectName=$3
HOST=$4

keySpec=$(echo -n "${secretKey}" | od -A n -t x1 | tr -d ' ')
iv=$(echo -n "${accessKey}" | od -A n -t x1 | tr -d ' ')

currentTimeMillis=$[$(date +%s%N)/1000000]
# use currentTimeMillis=$(date +s%000) instead for docker containers built from base image alpine or busybox.

seed=${accessKey}\|$currentTimeMillis
signature=$(printf %s "${seed}" | openssl enc -e -aes-128-cbc -base64 -K ${keySpec} -iv ${iv})

#Verify the signature by calling API through curl command to get project list.
RESULT=$(curl -k -s -H "accesskey: ${accessKey}" -H "signature: ${signature}" -H "Content-Type: application/json" https://${HOST}/project/listAll)

#Format and parse the returned JSON using jq
projectId=$(printf '%s\n' "${RESULT}" | jq '.data[] | select(.name == "'"${projectName}"'")' |jq .id) 
echo "Project ID of ${projectName} is:  ${projectId}"
################## End of the script ######################

■ 执行上述脚本:

$ sh getProjectId.sh <accessKey> <secretKey> <projectName> cloud.metersphere.com

■ 得到返回结果:

Project ID of Sample-Project is:  "e82f625a-aca6-4c72-9ac8-1234567890ms"

这证明接口已能成功调通,对于 CI/CD 流水线而言,只需将调用的 API 换成相应的触发测试计划或测试场景的接口即可。在需要的时候,也可以根据 MeterSphere 的 Swagger 接口文档,调用其他接口,实现更为强大而丰富的功能。


↙↙↙阅读原文可查看相关链接,并与作者交流