はじめに
APIテストではAPIキーやトークンなどの機密性の高いシークレット情報を使うケースが多々あります。
そこで今回はKarateでのシークレット情報の取り扱い方に触れてみたいと思います。
注意点
Karateが公開しているテンプレートではLogbackが使われており、テスト実行時のリクエスト/レスポンス内容がログファイルやテスト結果レポートに出力される場合があります。
また、テストスクリプトを記述するfeatureファイルや実行時の設定を記述するkarate-config.jsでは任意の内容をログ出力する処理を記述することもできます。
もし、その中にシークレット情報を使ったテストがあった場合、特に対策せずにテスト実行をするとセキュア情報がログファイルなどにそのまま出力されてしまいます。
対策
KarateのHttpLogModifierの実装クラスを作成し、セキュア情報のマスキングを行います。
実装クラスの作成
以下はKarateが公開している実装例です。
このheaderメソッドでは、リクエストヘッダーに”xss-protection”が含まれる情報がログ出力される際に”***”に変換するという処理が記述されています。
この実装例を参考に必要な箇所・必要な情報に対してマスキング処理を実装してください。
package demo.headers;
import com.intuit.karate.http.HttpLogModifier;
/**
*
* @author pthomas3
*/
public class DemoLogModifier implements HttpLogModifier {
public static final HttpLogModifier INSTANCE = new DemoLogModifier();
@Override
public boolean enableForUri(String uri) {
return uri.contains("/headers");
}
@Override
public String uri(String uri) {
return uri;
}
@Override
public String header(String header, String value) {
if (header.toLowerCase().contains("xss-protection")) {
return "***";
}
return value;
}
@Override
public String request(String uri, String request) {
return request;
}
@Override
public String response(String uri, String response) {
// you can use a regex and find and replace if needed
return "***";
}
}
実装クラスの適用
次に、HttpLogModifierの実装クラスが動作するように設定します。
- テストスクリプト毎に個別の設定をしたい場合
対象のfeatureファイルにHttpLogModifierの実装クラスのインスタンスを作成する処理を記述してください。
* def LM = Java.type('demo.headers.DemoLogModifier')
* configure logModifier = new LM()
- 全体に設定したい場合
karate-config.jsにHttpLogModifierの実装クラスのインスタンスを作成する処理を記述してください。
var LM = Java.type('demo.headers.DemoLogModifier');
karate.configure('logModifier', new LM());
この様な処理を実装することでKarateで安全にシークレット情報を取り扱ってAPIテストを実行することができます。