先日プロダクトのアップデートを管理しているJenkinsサーバに対して新たにAPIを送るよう実装する機会があり、その際にインフラチームから共有いただいたAPIの呼び出し方法が下記のようなものでした。
curl -k -X GET "https://hogehoge.jp/job
?token=${api_job_token}" -u ${api_user_name}:${api_user_token}
"-u"オプションって?
Specify the user name and password to use for server authentication. Overrides -n, --netrc and --netrc-optional.
If you simply specify the user name, curl will prompt for a password.
参照:https://curl.se/docs/manpage.html#-u
curl先のサーバーで行われる認証に対し、ユーザ名とパスワードを引き渡しているオプションが-u
オプションになります。
"curl"経由じゃなくて直接ヘッダーに認証情報を設定したい。。。
今回のケースではcurl
からではなくて、ヘッダーなどのリクエスト内容を直接規定する方法でJenkinsAPIへリクエストを送る必要がありました。下記のようにすることで、-u
オプションを利用して設定されるBasic認証情報をヘッダに設定することができます。(利用言語はPHP7.3)
private static function createHttpRequestForJenkins(): HttpRequest {
// Basic認証情報を設定
$encoded_user_info = base64_encode('user_name:password');
$request_header = [
'Content-type' => 'application/json',
'Authorization' => "Basic $encoded_user_info",
];
......
}
Basic認証では引き渡すユーザ名とパスワードはbase64形式でエンコードされる必要があるため、base64_encode
を使って認証情報を設定します。
エンコード済みの認証情報をヘッダーのAuthorization
要素として指定をすることで、リクエスト先サーバにBasic認証情報を送信することができます。その際、エンコードされた情報はBasic+半角空白
を接頭辞として持つ必要があります。
参照:https://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC
上記のままでもリクエストを送る上では問題ないのですが、createHttpRequestForJenkins
ではリクエストを送ることだけ知っていて欲しかったので、最終的には下記のようにして実装を行いました(メソッドの実装内容は割愛します)。
private static function createHttpRequestForJenkins(): HttpRequest {
$request_header = ApiRequestHeader::createContentTypeApplicationJsonHeader()
// basic認証情報を設定
->withBasicAuth('user_name', 'password');
......
}
まとめ
curl -u
はシンプルに認証情報をヘッダーに設定できる便利なオプションですが、いざ自分で同様の情報をヘッダーに設定する際に"?"となってしまったのでまとめてみました。どなたかのお役に立てば幸いです。