せっかく買ったYubiKey、デモサイトで認証しててもしょうがないので、 自作プログラムに組み込めるようPythonで簡単にプログラムを作ってみます。
まずYubiCloudを使って認証を行うためには、API Keyを取得する必要があります。 API Key取得サイト に行って、メールアドレスとYubiKeyのワンタイムパスワードを入力します。
クライアントIDとシークレットキーがすぐに表示されます。これをメモしておきます。
YubiKey用のライブラリをインストールします。私はPIPを使っていますので、 取り敢えず以下のコマンドで検索してみます。:
$ pip search yubico
yubico - Python Yubico Client
django_yubico - Django Yubico Authentication Backend
yubikey - Validate a Yubikey against Yubico's web-service
pam_yubico - Python PAM module which allows you to integrate
the Yubikey into your existing user authentication
infrastructure (supports online, failback and
offline mode)
yubicoclient - Python yubico client
一番上のyubicoを使って見ることにします。:
$ sudo pip install yubico
プログラムと言いましたが、今回はインタープリターでひと通り動作を確認します。 ここではipythonを使っていますが、普通のpythonコマンドでもやり方は変わりません。 初めにIn [...]:と書いてあるのが入力したコマンドです。
ちなみにやり方は このサイト のexample.pyの内容をそのまま打っただけです。:
$ ipython
In [3]: import sys
In [4]: from yubico import yubico
In [5]: from yubico import yubico_exceptions
次の行でAPI Keyの取得のときに表示されたクライアントキーとシークレットキーを入れます。 SSLでサーバーと通信する場合は後ろにTrueを指定します。:
In [8]: client = yubico.Yubico('クライアントID', 'シークレットキー', True)
では、YubiKeyのトークンを使って認証させます。:
In [9]: token = raw_input('YubiKey:')
YubiKey:vvabcdefghijbtvlvlljnlkcvnthrhvcrggiunjbuurg
In [11]: status = client.verify(token)
In [12]: status
Out[12]: True
ステータスはTrueとなりました。認証成功です。 では新しいトークンを発行せずもう一度同じトークンを試してみましょう。:
In [13]: status = client.verify(token)
StatusCodeError: Yubico server returned the following status code: REPLAYED_OTP
REPLAYED_OTPと出ました。使用したワンタイムパスワードははねられます。 では適当な文字列で認証できるか試してみましょう。:
In [14]: status = client.verify('testaaa')
SignatureVerificationError: 'Server response message signature verification failed
Signature verification failedと出ました。ちゃんとはねられています。 認証できたので安心していましたが、これでは誰のキーか分かりません。 全く関係ない人のキーかもしれませんので、以下の要領でデバイスのIDを取得します。:
In [32]: otp = yubico.OTP(token)
In [33]: otp.device_id
Out[33]: u'vvabcdefghij'
といってもワンタイムパスワードの初めの12文字を切り取ればいいだけですが。 このデバイスIDをユーザーと紐付けておけば、誰のキーか確認できます。
0 件のコメント:
コメントを投稿