やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

二要素認証でGitHubAPIを叩いてみた

二要素認証でもAPIが使えるか試してみた。

結論

二要素認証でもAPIが使えた。でも、完全自動化はできなかった。

入手先

GitHub MEGA

以前やったリポジトリ取得バッチの改良版。 二要素認証のケースも追加し、少し修正した。これで二要素認証でもAPIが使えるか確認できた。

経緯

以下、作成に至った経緯。

根拠なき推測

おそらくWinAuthはGoogle AuthenticatorのWebAPIを実行しているのだろう。 GitHubQRコードから得た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でクリックする手間が必要になってしまう。

  1. WinAuthを起動する
  2. パスワードを入力する
  3. 発行ボタンを押下する
  4. 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で叩くとき、どの認証方式を用いるのがベストなのか。 それを考える必要がありそう。