サブドメインとセッションを共有する

PythonのBeakerを使って、あるドメインと、そのドメインのサブドメインの間で認証を共有することを目指します。つまり、example.comでログインしたら、sub.example.comでもログインしている状態になるようにします。フレームワークにPyramidを使用していますが、Pyramidに依存していないので、他のフレームワークでも同じことができます。

私はVagrantを 192.168.111.222 で立ち上げるので、ホストのhostsをこのように、 example.comsub.example.com192.168.111.222 に向けます。

192.168.111.222      example.com sub.example.com

Beakerを使い、情報をデータベースに入れて共有することで実現します。

pip install pyramid_beaker

今回はデータベースにPostgreSQLを使用してます。これは example.com 用の設定です。development.iniの app:main セクションに追記します。

session.cookie_domain = .example.com
session.key = session
session.lock_dir = /var/lock/main/sessions
session.schema_name = manage  # オプション
session.secret = secret
session.table_name = sessions  # オプション
session.type = ext:database
session.url = postgresql://postgres:postgres@localhost/demo

こちらは sub.example.com 用の設定です。development.iniの app:main セクションに追記します。違いはsession.lock_dirの値だけです。

session.cookie_domain = .example.com
session.key = session
session.schema_name = manage  # オプション
session.lock_dir = /var/lock/sub/sessions
session.secret = secret
session.table_name = sessions  # オプション
session.type = ext:database
session.url = postgresql://postgres:postgres@localhost/demo

さらに、それぞれの pyramid.includespyramid_beaker を追加します。

pyramid.includes = pyramid_beaker

mainのviews.pyにこの二行を追記します。

print("User ID: {}".format(request.session.get('user_id')))
request.session['user_id'] = 123

これでmainにアクセスすると、一回目は User ID: None が出力され、二回目には User ID: 123 が出力され、sessionに値を格納できていることが確認できます。後は、この値を sub.example.com から読み出すことができれば、セッションの共有の完了です。

subのviews.pyにこの一行を追記します。

print("User ID: {}".format(request.session.get('user_id')))

mainにアクセスした後なら、subにアクセスしたときに User ID: 123 が得られます。

コメント

2015 - 2017 (c) 成瀬基樹