API署名の処理
期待の効果
- 各 APIを手動で配置する代わりに、API署名を一括処理します。
実装方法
- 署名のロジックを含む共通Scriptを作成し、APIのRequestパラメータを読み取り、内蔵のライブラリ(crypto-jsなど)を使用して署名を生成します。
- 生成された署名をパラメータとして追加するには2つの方法があります。
- 方法 1:署名パラメータを追加し、Scriptを介して直接にRequest 情報を変更します(環境変数を使用する必要はなし)。
- 方法 2:生成された署名を環境変数に書き込み、APIパラメータで当該変数を参照します。
- APIの前処理Scriptで上記で生成した共通Scriptを参照します。
- 署名アルゴリズムが別の言語で書かれている場合は、dog.executeを使用して、別の言語で書かれたプログラムを呼び出します。
API署名の例
署名生成のルール
ステップ1:全てのパラメータをセットMに設定します。そして、ASCIIコードに基づいてセットM 中の空でないパラメータを昇順に並べ、URLキーと値のペア形式(つまり、key1=value1&key2=value2...)を使用して、空でないパラメータをstringAに結合します。
次のポイントにご注意ください:
ASCIIコードに基づいてパラメータ名を昇順(辞書順)で並べ替えます。
空のパラメータ値は署名に含まれません。
パラメータ名は大文字と小文字を区別します。
記号パラメータも署名に含まれません。
ステップ2:stringAの末尾にkeyを追加すると、stringSignTempを取得し、stringSignTempに対してMD5アルゴリズムを使用し、結果の文字列を大文字に変換してsignValueを取得します。
共通Scriptの実装
// Get the key from the environment variable APPKEY
let key = pm.environment.get("APPKEY");
// Store all parameters needed for signature
let param = {};
// Add query parameters
let queryParams = pm.request.url.query;
queryParams.each(item => {
if (item.value !== '') { // Only non-empty value will be included.
param[item.key] = item.value;
}
});
// Add body parameter
if (pm.request.body) {
let formData;
switch (pm.request.body.mode) {
case 'formdata':
formData = pm.request.body.formdata;
break;
case 'urlencoded':
formData = pm.request.body.urlencoded;
break;
case 'raw':
// If there is no JSON-formatted request body, or if the JSON-formatted body is not included in the signature, remove the code block.
let contentType = pm.request.headers.get('content-type');
if (
contentType
&& pm.request.body.raw
&& contentType.toLowerCase().indexOf('application/json') !== -1
) {
try {
let jsonData = JSON.parse(pm.request.body.raw);
/*
* If the API parameter extracted from the script includes variables, the variables will not automatically be replaced by its value. In order to get its value, use `pm.variables.replaceIn`.
* let body = pm.variables.replaceIn(pm.request.body.raw);
* let jsonData = JSON.parse(body);
*/
for (let key in jsonData) {
let value = `${jsonData[key]}`; // Note that if the actual value is not string type, you will need to modify the code block accordingly.
if (value !== '') { // Only non-empty parameter values will be included.
param[key] = value;
}
}
} catch (e) {
console.log('request body is not in JSON format')
}
}
break;
default:
break;
}
if (formData) {
formData.each(item => {
if (item.value !== '') { // Only non-empty parameter values will be included.
param[item.key] = item.value;
}
});
}
}
// Get the key.
let keys = [];
for (let key in param) {
// Note that we need to remove the sign parameter.
if (key !== 'sign') {
keys.push(key);
}
}
// Sort the parameter name based on ASCII code by ascending order (dictionary order).
keys.sort();
// Convert to key-value pairs.
let paramPair = [];
for (let i = 0, len = keys.length; i < len; i++) {
let k = keys[i];
paramPair.push(k + '=' + encodeURIComponent(param[k])) // urlencode coding
}
// Add key.
paramPair.push("key=" + key);
// Concatenation.
let stringSignTemp = paramPair.join('&');
// console.log(stringSignTemp);
let sign = CryptoJS.MD5(stringSignTemp).toString().toUpperCase();
// console.log(sign);
// Method 1: Add a signature parameter and modify request information directly via scripts (no need to use environment variables).
// View more in documentation. [https://www.apidog.com/help/app/scripts/examples/request-handle/](https://www.apidog.com/help/app/scripts/examples/request-handle/)
queryParams.upsert({
key: 'sign',
value: sign,
});
// Method 2: Write it into an environment variable. You will need to reference the environment variables in API parameters.
// pm.environment.set("SIGN", sign);
例:翻訳サービスのAPI署名
署名生成ルール
ステップ1. 順番にAPPID(appid)、 翻訳 Query(q、UTF-8エンコーディング)、ランダムナンバー(salt)及び プラットフォームに割り当てられたキー(key、管理コンソールで確認可能)を文字列 1として合わせます。
ステップ2. 文字列 1に対してmd5アルゴリズムを使用して、32ビットの小文字 Signを取得します。
ご注意:
- 翻訳待ちのテキスト(q)はUTF-8エンコーディングである必要があります。
- appid+q+salt+keyを合わせて署名にするときは、q(翻訳 Query)にURLエンコードを適用しないでください。署名が生成されてHTTPのRequestを送信する直前に、q(翻訳 Query)にURLエンコードを適用します。
Example - Translate apple from English to Chinese
Request parameters:
q=apple
from=en
to=zh
appid=2015063000000001
salt=1435660288
Platform assigned key: 12345678
Generate sign:
>Concat string 1.
Concat appid=2015063000000001+q=apple+salt=1435660288+key=12345678
into string 1 =2015063000000001apple143566028812345678
> Generate the signature sign. Use the md5 algorithm on string 1 to get the 32-bit lowercase sign. Before using the md5 algorithm, string 1 needs to be in UTF-8 encoding.
sign=md5(2015063000000001apple143566028812345678)
sign=f89f9594663708c1605f3d736d01d2d4
The complete request is going to be:
http://xxx/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
共通Scriptの実装
// Get query params
var queryParams = pm.request.url.query;
// Get q from query params.
var q = queryParams.get("q");
// Get the value of environment variables APPID and SECRET_KEY
var appid = pm.environment.get("APPID");
var secretKey = pm.environment.get("SECRET_KEY");
// Generate a random number between 32768 and 65536.
var salt = parseInt(Math.random() * 32769 + 32768, 10);
// Convert the random number into a string.
salt = salt.toString();
console.log(salt);
// Concat a string using appid+q+salt=secretKey
var str = appid + q + salt + secretKey;
console.log(str);
// Use md5 algorithm on the string to generate sign
var sign = CryptoJS.MD5(str).toString();
// Method 1: Add salt and sign in the query parameters for the API (no need to use environment variables).
// View documentation here: https://www.apidog.com/help/app/scripts/examples/request-handle/
queryParams.upsert({
key: "salt",
value: salt,
});
queryParams.upsert({
key: "sign",
value: sign,
});
// Method 2: Write salt and sign in global variables. You will need to reference the global variables in API parameters.
// pm.environment.set("SALT", salt);
// pm.environment.set("SIGN", strmd5);