2012年6月26日火曜日

YubiCloud認証プログラムを作る

せっかく買ったYubiKey、デモサイトで認証しててもしょうがないので、 自作プログラムに組み込めるようPythonで簡単にプログラムを作ってみます。

まずYubiCloudを使って認証を行うためには、API Keyを取得する必要があります。 API Key取得サイト に行って、メールアドレスとYubiKeyのワンタイムパスワードを入力します。

http://3.bp.blogspot.com/-h4SPWREpCh8/T-eoa0SyHiI/AAAAAAAAANg/1VP-2vViJPY/s320/screenshot.25-06-2012+08.27.44.png

クライアントIDとシークレットキーがすぐに表示されます。これをメモしておきます。

http://4.bp.blogspot.com/-VNB5jjVZQvM/T-eo8jHXq7I/AAAAAAAAANw/5jiNX55iSu0/s320/screenshot.25-06-2012+08.28.42.png

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をユーザーと紐付けておけば、誰のキーか確認できます。

1 件のコメント: