ばぁど・うぉっちんぐ

セキュリティに強いWeb屋。自由と春を求めて羽ばたく渡り鳥。

このブログはGoogle Analyticsを利用しています

OTPを設定したGitHubにPythonでアクセスする時のメモ

サイバーセキュリティプログラミング-Pythonで学ぶハッカーの思考- で勉強をしていたお話。

www.oreilly.co.jp

第7章のサンプルコードの通り、GitHubPythonからいじれるようにしたい。

しかしセキュリティの観点からGitHubにOTP認証を設定しており、単純にログインをすることができなかった。

github3.exceptions.AuthenticationFailed: 401 Must specify two-factor authentication OTP code.

使用したライブラリ

PythonからGitHubを操作できるようにするライブラリ。 github3py.readthedocs.io

今回は、上記のlogin関数を用いる。

github3py.readthedocs.io

[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を利用する。

github3py.readthedocs.io

具体的には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を使えばいいというお話。 あまり日本語での解決記事なかったため備忘録として残しておきます。

まとめ

  1. 多要素認証を設定していても問題なくpythonからGItHubを操作できる
  2. 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