二要素認証でもAPIが使えるか試してみた。
結論
二要素認証でもAPIが使えた。でも、完全自動化はできなかった。
入手先
以前やったリポジトリ取得バッチの改良版。 二要素認証のケースも追加し、少し修正した。これで二要素認証でもAPIが使えるか確認できた。
経緯
以下、作成に至った経緯。
根拠なき推測
おそらくWinAuthはGoogle AuthenticatorのWebAPIを実行しているのだろう。 GitHubのQRコードから得たSecretCodeを渡して。
otpauth://totp/github.com/ユーザ名?issuer=GitHub&secret=16桁のコード
という書式の文字列を渡せば6桁のOTPを返してくれるWebAPIがあるのではないか、と予想している。
Google AuthenticatorのWebAPIが実行できれば、自動化できるはず。 まずはそんなAPIが実在するのか。ないならWinAuthはどうやってOTPを生成しているのかを調べる。
こちらをみてみた。Google公式ライブラリがある?でも Google Authenticator のWebAPIがあるかどうかはわからなかった。
その辺を調べるのが面倒そう。もう少し簡単なところから考えてみるか。
WinAuth+クリップボード
WinAuthでOTP発行ボタンを押下したら、OTPがクリップボードに貼り付けられる。 これを利用して、クリップボードからOTPを取得して、GitHubAPIのパラメータに指定できないだろうか。
完全な自動化はできない。WinAuthでクリックする手間が必要になってしまう。
- WinAuthを起動する
- パスワードを入力する
- 発行ボタンを押下する
- 30秒以内にGitHubAPIを実行するバッチを叩く
とりあえず形にするため、これで妥協する。
コンソールからクリップボードの値を得る
ところで、どうやってコンソールからクリップボードの値を得ればいい?
Windows7にはclip.exeというツールがあるらしい。でも、Windows XPにはclip.exeがない。探したらPICLというツールがあった。 ありがたく使わせていただきます。
picl.exe -n -o
というコマンドでクリップボードの内容を標準出力へ吐き出せるらしい。
batで標準出力の値を変数に入れる方法を使って、クリップボードの内容を変数に入れると以下のコードになる。
FOR /F "usebackq" %%i in (`picl.exe -n -o`) DO @set OTP=%%i
GitHubAPIにOTPを渡す
ところで、どうやってGitHubAPIにワンタイムパスワードを渡せばいい?
公式サイトのWorking with two-factor authenticationをみると、X-Github-OTP: 6桁のOTP
のようなHTTPヘッダを指定すると二要素認証できるらしい。curlでリクエストするときはcurl -H "X-Github-OTP: 012345" -u "username:password" ...
のようになるだろう。
ワンタイムパスワードは30秒ごとに変わってしまうから手間取っていられない。
ところで、「Basic認証では必須」というところが気になる。 もしかしてAccessTokenを使えばOTP不要なのか? それは次回、確かめてみる。
所感
二要素認証でもGitHubAPIは使える。
でも、完全自動化できない。できたらセキュリティ的に意味がないかもしれないが。 また、パスワードがファイルに残ったり通信傍受で漏洩することもありえそう。 その場合、OTPだけで守ることになってしまわないか?
では、GitHubAPIで叩くとき、どの認証方式を用いるのがベストなのか。 それを考える必要がありそう。