Pythonで2段階認証のワンタイムパスワードの取得

pythonプログラムの中で、二段階認証コードを取得する必要がありましたので、その備忘録を。

概要

OS:MacOSX Mojave

開発環境:Spyder(python3.6)

pythonプログラムで、bashコマンドを呼び出し、oath-toolを実行して、出力されるワンタイムパスワードを文字列としてpythonで取得します。

Oath tool のインストール

 brew install oath-toolkit

Sierraのときにインストールしたbrewで、上記コマンドのインストールを試したのですが、シンボリックリンクが作成できない、というエラーが出て、oath-toolのインストールができませんでした。

いろいろ試行錯誤しましたが、できなかったので、brewを再インストールしました。

再インストールは以下の記事を参考にさせていただきました。

https://qiita.com/uhooi/items/91d2261ab30b6f2c143a

pythonプログラム

import subprocess
 
cmd = ['oathtool', '--totp', '--base32', '2段階のシークレットキー']
 
out = subprocess.run(cmd, stdout=subprocess.PIPE)
fa_string = out.stdout.decode()
string_2fa = fa_string[:6]#取得する文字列の最後に改行があるため、6文字で切る処理
print(string_2fa)

つまずいた点

①bashターミナルで実行する

最初は、spyderのi python consoleで実行していたのですが、oathtoolが見つかりませんとなり、実行できませんでした。環境変数周りなどの設定が必要なのかもしれませんが、python開発環境にあまり詳しくないので、とりあえず実行できるbashのターミナルで検証を行いました。

②oathtoolの返すパスワード文字列(string_2faのところ)

上記プログラムを二段階認証をパスさせるためにプログラムに組み込もうとしていたのですが、ひたすらはじかれました^^;どうやら、文字列の最後に改行?(正確に文字コードは調べてないですが)が入っていたので、6文字目までをパスワードとして取得することで、正常なワンタイムパスワードとして取得できました。

参考にしたサイト様

subprocess関連

https://www.sejuku.net/blog/65485