サイバーセキュリティプログラミング-Pythonで学ぶハッカーの思考- で勉強をしていたお話。
第7章のサンプルコードの通り、GitHubをPythonからいじれるようにしたい。
しかしセキュリティの観点からGitHubにOTP認証を設定しており、単純にログインをすることができなかった。
github3.exceptions.AuthenticationFailed: 401 Must specify two-factor authentication OTP code.
使用したライブラリ
PythonからGitHubを操作できるようにするライブラリ。 github3py.readthedocs.io
今回は、上記のlogin
関数を用いる。
[USAGE] github3.login(username=None, password=None, token=None, two_factor_callback=None) [Parameters] username (str) – login name password (str) – password for the login token (str) – OAuth token two_factor_callback (func) – (optional), function you implement to provide the Two Factor Authentication code to GitHub when necessary [Returns] GitHub
解決策
login()
の引数にもあるようにtwo_factor_callback
を利用する。
具体的にはtwo_factor_callback
で多要素認証を設定している場合、呼び出すような関数を実装しておく必要がある。
上記のサンプルコードを参考にすると下記のような感じ。 ※ところどころ編集
import github3 prompt = input def my_two_factor_function(): code = '' while not code: code = prompt('Enter 2FA code\n') return code g = github3.login('ultrabirdtech', 'my_password', two_factor_callback=my_two_factor_function)
上記を実装したところ、callback
関数が呼ばれ、input()
の入力要求でOTPを入力することで認証の処理に進めるようになった。
# python git_trojan.py Enter 2FA code XXXXXX # X はワンタイムパスワード OTP Auth Succsess!!
単純にcallback
を使えばいいというお話。
あまり日本語での解決記事なかったため備忘録として残しておきます。
まとめ
特段、難しい解決方法ではなかった印象。 公式ドキュメントをしっかり読みましょう。
おまけ
実装中にログイン失敗しすぎると、一定期間ログインできなくなります。 感覚的には割と早くアカウントロック時間は短かった印象です。
まぁ、アカウントロック機能があるのは当たり前っちゃ当たり前。
github3.exceptions.ForbiddenError: 403 Maximum number of login attempts exceeded. Please try again later.
おまけ2 (5/19 16:45追記)
結局、githubにアクセスするごとにOTP入力が必要なクソアプリが完成したとのことです。
サンプルコードの出力結果(期待値)
[*] Found file abc.json [*] Attempting to retrieve dirlister [*] Attempting to retrieve environment [*] In dirlister module. [*] In environment module.
実際の出力結果
Enter 2FA code XXXXXX OTP Auth Succsess!! Enter 2FA code XXXXXX Enter 2FA code XXXXXX [*] Found file abc.json Enter 2FA code XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [*] Attempting to retrieve dirlister Enter 2FA code XXXXXX OTP Auth Succsess!! Enter 2FA code XXXXXX [*] Attempting to retrieve environment Enter 2FA code XXXXXX OTP Auth Succsess!! Enter 2FA code XXXXXX [*] In dirlister module. Enter 2FA code XXXXXX OTP Auth Succsess!! Enter 2FA code [*] In environment module. XXXXXX Enter 2FA code XXXXXX OTP Auth Succsess!! Enter 2FA code XXXXXX