tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

curlでBasic認証する方法3つ - と、記号を含むとき注意点など

はじめに

コマンドライン(crul)でBasic認証を叩きたいときのメモ。
とくに、Authorization ヘッダで実行したいときに迷ったので自分用のメモです。

アジェンダ

前提情報

このメモ環境はMac環境です。
OS Versionなどで差異はないはずなので今回は記載を省きます。

また、crulする情報は以下として扱います。

URL : https://www.example.com/login
ID  : hogehoge
PASS: fuga@)fuga

1. curlでBasic認証 - オプションで指定

ひとつめはcrulのオプションで指定する方法です。
IDとPASSを: (コロン)で挟んで指定します。

コマンド:  
curl -u <ID>:<PASS> https://www.example.com/login

注意点

<ID>:<PASS>のパスワードに特殊記号を含む場合、エラーになります。
その場合は、ダブルクオートやシングルクオートで囲ってあげましょう。

# エラーになる例
$ curl -u hogehoge:fuga@)fuga https://www.example.com/login
-bash: syntax error near unexpected token `)'

# エラーを回避する例
$ curl -u 'hogehoge:fuga@)fuga' https://www.example.com/login

2. curlでBasic認証 - URL埋め込み

crulのURLに埋め込む方法です。

コマンド:  
https://<ID>:<PASS>@www.example.com/login

コマンド:

注意点

<ID>:<PASS>のパスワードに特殊記号を含む場合、エラーになります。
こちらも、シングルクオートなどで囲むとエラーを回避できます。

ただし、URLとしての正しさも保ちたいですよね。
その場合は、シングルクオートではなくURLエンコードしてやります。

今回はperlのワンライナーを使いますが、URLエンコードしてくれるWebサイトなんかでもかまいません。

# エラーになる例
$ curl -u hogehoge:fuga@)fuga https://www.example.com/login

# エラーを回避する例
## まずは、perlのワンライナーでエンコード文字列を得る
$ echo "hogehoge:fuga@)fuga" | perl -nle 's/([^\w ])/"%".unpack("H2",$1)/eg; s/ /\+/g; print'
hogehoge%3afuga%40%29fuga

## 上記の文字列をつかう
$ curl -u hogehoge:hogehoge%3afuga%40%29fuga https://www.example.com/login

3. curlでBasic認証 - Authorization ヘッダ指定

最後は、Authorization ヘッダを指定する方法です。
curlでのAuthorizationヘッダは−Hオプションで指定します。

コマンド:
curl https://www.example.com/login \
  -H "Authorization:Basic <BASE64エンコードした<ID>:<PASS>>"

注意点

上記の<BASE64エンコードした<ID>:<PASS>>の部分ですが、
BASE64エンコードを事前にコマンドなどで行ってから文字列を指定します。

# BASE64エンコード
$ echo -n "hogehoge:fuga@)fuga" | base64
aG9nZWhvZ2U6ZnVnYUApZnVnYQ==

# BASE64エンコードした文字列を指定
$ curl https://www.example.com/login \
  -H "Authorization:Basic aG9nZWhvZ2U6ZnVnYUApZnVnYQ=="

参考

おわりに

コマンドだけでなく、プログラムから指定する場合なんかもこれでいけますね!