Python で OpenID を使う(1) サンプルを動かす
1.OpenID の仕組み
まず、OpenIDの仕組みだが、
http://www.atmarkit.co.jp/news/analysis/200704/23/openid.html
の図がわかりやすかった。
2.Python OpenID ライブラリ
2.1 サンプルを動かす手順を確認する
https://github.com/openid/python-openid
に、PythonからOpenIDを利用するためのライブラリがある。
。。。のだが、にわかにはどう使ってよいのかわからない。
examples を見てみるのだが、ソースをみて、移植するにはちと複雑なので、すなおに、README の手順に従ってみる。
以下、意訳。まちがっていたらごめんなさい。
Python OpenId Library example code
========================================
examples ディレクトリは OpenID認証を実行するライブラリの使用方法を説明する、コンシューマおよびサーバー両方の実際に動くコードを含んでいる。
コンシューマは外部への依存関係がなく実行でき、サーバーは、Django Webフレームワークを利用している。
この例では、すべての機能についての利用方法を説明しているわけではないが、
どのように自分自身のコードでライブラリを利用したらよいかの有用な開始点となるはずである。Django および BaseHTTPServer の例では、OpenID ライブラリがインストールされているもしくは、Python のサーチパス(PYTHONPATH 環境変数もしくはsys.path)に追加されている必要がある。
Djangoの例はおそらくコードを読み始めるにはよい開始点である。この例でDjango特有の箇所は小さく、他のフレームワークへの移植も容易である。Django examples を実行すると、READMEファイルが djopenid サブディレクトリで確認できる。
もうひとつの例では、Pythonに組み込まれている、BaseHTTPServer および 多くのアドホックなディスパッチおよびレンダリングコードが混ぜこまれている。
BaseHTTPServer の例
======================
このディレクトリは、OpenIDライブラリを利用するサーバーとコンシューマーを含んでいる。どちらもPython標準のBaseHTTPServerで書かれている。example システムを実行するには:
1.インストール手順どおり、ライブラリがインストールされていることを確認
2.コンシューマーサーバーを開始
python comsumer.py –port 8001
3.別のターミナルで、identityサーバーを開始
python server.py –port 8000
4.ブラウザを立ち上げ、コンシューマーサーバーへ移動
http://localhost:8001/
注意:コンシューマーサーバーのすべてのページは、”Python OpenID Consumer Example” をtop経由で表示する
5.サンプルidentityサーバーで管理される、identity URLを入力
http://localhost:8000/id/bob
6.ブラウザは、サンプルサーバーへリダイレクトし、ログインプロセスを要求する。
identity URLへのユーザー名をログインボックスへ入力する
bob
注意:コンシューマーサーバーのすべてのページは、”Python OpenID Consumer Example” をtop経由で表示する
7.bobとしてログインしたのち、サーバーexampleは、
http://localhost:8001 がidentityを識別することを許可したいかどうかを尋ねる。yes と答える
8.最終的にコンシューマーサイトに戻され、ページには、ログインが成功したことが表示される。これらが、基本的なOpenIDの手続きとなる。さまざまなパターンでどのように動くのか試してみることができる。
Pythonコードは、PythonでどのようにOpenIDライブラリを利用してidentityサーバーとコンシューマーを機能させるかの単刀直入な例となっている。
2.2 OpenIDをインストール
Virtualenvの環境にpipでインストールする。
(virtualenv)[piroto@localhost python-openid-2.2.5]$ pip install python-openid==2.2.5 You are using pip version 6.0.3, however version 6.0.6 is available. You should consider upgrading via the 'pip install --upgrade pip' command. Collecting python-openid==2.2.5 Downloading python-openid-2.2.5.tar.gz (301kB) 100% |################################| 303kB 5.0MB/s Installing collected packages: python-openid Running setup.py install for python-openid Successfully installed python-openid-2.2.5
2.3 GitHubからサンプルソースをCloneして起動する
(virtualenv)[piroto@localhost python_openid]$ git clone https://github.com/openid/python-openid.git Initialized empty Git repository in /home/piroto/Pictures/OpenId/python_openid/python-openid/.git/ remote: Counting objects: 10787, done. remote: Total 10787 (delta 0), reused 0 (delta 0) Receiving objects: 100% (10787/10787), 5.19 MiB | 959 KiB/s, done. Resolving deltas: 100% (6475/6475), done.
上記、READMEの記述にしがたい、コンシューマーを動かす。
(virtualenv)[piroto@localhost python-openid]$ cd examples/ (virtualenv)[piroto@localhost examples]$ python consumer.py --port 8001 Server running at: http://localhost.localdomain:8001/
別のコンソールを立ち上げ、サーバーを動かす。
(virtualenv)[piroto@localhost examples]$ python server.py --port 8000 Server running at: http://localhost.localdomain:8000/
2.4 動作確認
Identifier に http://localhost:8000/id/bob を入力して、verify をクリックすると、、、
うーむ。HTMLが生で表示されてしまう。
examples/consuper.py が若干バッグっているようだ。修正して動かす。
def doVerify() の終わりくらいに、以下パッチの+の行を追記する。
(一応開発元へ連絡してみた。そのうち修正されるとよいな)
*** consumer.py 2015-01-11 22:37:02.130994986 +0900 --- consumer.py.fixed 2015-01-11 22:15:00.400771083 +0900 *************** *** 207,212 **** --- 207,215 ---- trust_root, return_to, form_tag_attrs={'id':'openid_message'}, immediate=immediate) + self.send_response(200) + self.send_header('Content-type', 'text/html') + self.end_headers() self.wfile.write(form_html) def requestRegistrationData(self, request):
おーうごいた。うごいた。
ということで、サンプルを動かせるようにはなったので、動きを見ながら、いろいろ試していこう。