エキPy lt repoze.whoの紹介
-
Upload
atsushi-odagiri -
Category
Documents
-
view
629 -
download
0
Transcript of エキPy lt repoze.whoの紹介
![Page 1: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/1.jpg)
repoze.whoエキスパートPython読書会 LT
aodag
![Page 2: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/2.jpg)
repoze.whoとは?
Web認証フレームワーク
WSGIミドルウェアでもAPI呼び出しでも使える
ユーザー認証の各フェーズを細かく設定できるpyramidでも使えるよ
![Page 3: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/3.jpg)
認証のフェーズ
IdentifyChallengeAuthenticate
![Page 4: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/4.jpg)
Identify
リクエストから認証情報を取り出すレスポンスに認証情報を追加するレスポンスから認証情報を削除する
![Page 5: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/5.jpg)
Challenger
認証を開始するための情報をレスポンスに追加する
![Page 6: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/6.jpg)
Authenticate
ユーザー入力などを認証する
![Page 7: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/7.jpg)
![Page 8: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/8.jpg)
Basic認証の場合(1)
Identifierがリクエスト の Authorizationヘッダを読み取る
なかった場合
Challengerが WWW-Authorizationヘッダを追加して、ブラウザにBasic認証を促す
![Page 9: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/9.jpg)
Basic認証の場合(2)
Identifierがリクエスト の Authorizationヘッダを読み取る
読み取った内容を Authenticate する。
成功だったら、アプリケーションが呼び出される。レスポンスを返すときに、 Identifierがレスポンスに認証結果を追加する
![Page 10: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/10.jpg)
repoze.whoを使う
1. WSGIミドルウェアとして使う
2. APIとして使う
3. 両方を混ぜる
![Page 11: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/11.jpg)
repoze.whoの設定
1. iniファイルで指定する
2. Pythonコードで指定する
![Page 12: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/12.jpg)
設定例
認証情報はAuthTktで保存する認証自体はSQLAlchemyのモデルで行うログイン画面を使う
![Page 13: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/13.jpg)
who.ini 各プラグインの設定
[plugin:auth_tkt]use = repoze.who.plugins.auth_tkt:make_pluginsecret = SeCrEt
[plugin:sqla]use = repoze.who.plugins.sa:make_sa_authenticator
[plugin:redirect]use = repoze.who.plugins.redirector:make_pluginlogin_url = /login
![Page 14: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/14.jpg)
who.ini 認証を構成する
[identifiers]plugins = auth_tkt
[authenticators]plugins = sqla
[challengers]plugins = redirect
![Page 15: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/15.jpg)
PasteDeploy + WSGIミドルウェア
[filter:who]use = egg:repoze.who#configconfig_file = %(here)s/who.ini
![Page 16: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/16.jpg)
ログイン画面でAPIを使う
api = repoze.who.api.get_api(environ)identity = { 'login': request.POST['username'], 'password': request.POST['password'],}
authenticated, headers = api.login(identity)
![Page 17: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/17.jpg)
Pyramidで使うには?
pyramid_whoを使うと、repoze.whoの認証結果をpyramidのautenticated_useridから取得できるようになる
![Page 18: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/18.jpg)
Pluginを作るには?
IIdentifier, IAuthenticator, IChallenger を実装しましょう。
多分、 IAuthenticator を実装することが多い
![Page 19: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/19.jpg)
IAuthenticator を実装する
@implementer(IAuthenticator)class MyAuthenticator(object): def __init__(self, members): self.members = members
def authenticate(self, environ, identity): member = identity['member'] return (member if member in members else None)
![Page 20: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/20.jpg)
設定ファイルで使えるようにする
def make_plugin(members=None): assert members is not None, u"設定しろ"
members = members.split() return MyAuthenticator(members)
![Page 21: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/21.jpg)
使う!
[plugins:my]use = aodag.who.plugins:make_pluginmembers = aodag drillbits shimizukawa takanory...[authenticators]plugins = my
![Page 22: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/22.jpg)
いろんなプラグイン
標準● AuthTkt● Basic認証● HTPasswd● リダイレクト● SQL
追加アドオン● LDAP● SQLAlchemy● OpenID
etc...
![Page 23: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/23.jpg)
まとめ
repoze.whoは認証フレームワーク
認証処理の各フェーズを組み合わせて使える
すでに十分なプラグインがある
必要な場合はプラグインを簡単に追加できる
![Page 24: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/24.jpg)
まとめ
とっつきにくいけどいいやつだよ!
![Page 25: エキPy lt repoze.whoの紹介](https://reader034.fdocuments.net/reader034/viewer/2022042715/55959ffe1a28ab00448b45fa/html5/thumbnails/25.jpg)
LINKS
● repoze.who – WSGI Authentication Middleware