microdot.session --- 署名付きクッキーセッション

単一の session クッキー内の jwt を基盤とする、ユーザーごとのキー/値ストアです。JWTはアプリケーションだけが知っているシークレットで署名されるため、クライアントはクッキーを読み取ることはできますが、サーバーに検出されることなくペイロードを改ざんすることはできません。

class Session

class microdot.session.Session(app: Microdot | None = None, secret_key: bytes | str | None = None, cookie_options: dict | None = None)
app

インストール先の microdot.Microdot インスタンスです。オプションです。指定しない場合は後で initialize() を呼び出します。

secret_key

セッションJWTの署名に使用する対称鍵です。セッションの読み書きの前に必須です -- これなしで get() にアクセスすると ValueError が発生します。ソース管理の外に保存してください。カメラ上では通常FATファイルシステム上のファイルになります。

cookie_options

セッションクッキーが書き込まれるたびに microdot.Response.set_cookie() に転送されるオプションの辞書です。デフォルトでは path='/'http_only=True が設定されます。HTTPS専用のデプロイメントでは secure=True を追加してください。

initialize(app: Microdot, secret_key=None, cookie_options=None)

構築が遅延された場合に app にアタッチします。secret_key / cookie_options は、指定されればコンストラクタの値を上書きします。

get(request) SessionDict

request のセッション辞書を返します。辞書は最初のアクセス時に session クッキーから遅延デコードされ、リクエストの残りの間 request.g._session にキャッシュされます。改ざんされた / 署名できないクッキーは空の辞書を返します。

encode(payload: dict, secret_key=None) str

payload をセッションのシークレットでJWTとしてエンコードします。内部的に使用されますが、互換性のあるトークンを生成したい呼び出し元のために公開されています。

decode(session: str, secret_key=None) dict

JWT文字列のセッション値を検証してデコードします。検証に失敗した場合は {} を返します。

secret_key: bytes | str | None

セッションJWTの署名と検証に使用する署名シークレットです。構築後に設定可能です。設定されるまでは None で、これなしでセッションを読み取ると ValueError が発生します。

cookie_options: dict

セッションクッキーが書き込まれるときに適用されるオプションの辞書で、microdot.Response.set_cookie() に転送されます。initialize() の実行後、デフォルトで path='/'http_only=True が設定されます。

class SessionDict

class microdot.session.SessionDict(request, session_dict)

Session.get() が返す辞書ライクなオブジェクトです。dict をサブクラス化しているため、すべての標準的な変更操作が機能します。2つの追加メソッドが変更をレスポンスにコミットします。

save()

(場合によっては変更された)セッションを新しい session クッキーとしてレスポンスに書き戻します。この呼び出しがないと、その場での編集はリクエストの終了時に失われます。

delete()

レスポンスにクッキー削除ヘッダーを発行することでセッションを削除します。

モジュールレベルのデコレータ

microdot.session.with_session(f)

セッション辞書をルートハンドラに第2引数として渡すデコレータです:

from microdot import Microdot
from microdot.session import Session, with_session

app = Microdot()
Session(app, secret_key=load_secret())

@app.get('/counter')
@with_session
async def counter(request, session):
    session['n'] = session.get('n', 0) + 1
    session.save()
    return {'n': session['n']}

このデコレータは自動保存しません -- セッションが変更された場合は SessionDict.save() を呼び出してください。

セッションペイロード自体は、JWT内にJSONとしてシリアライズされた通常のPython辞書です。小さく保ってください。すべてのリクエストとすべてのレスポンスがクッキー全体を運び、JWTは大きなオブジェクトを格納するように設計されていません。数百バイトを超えるユーザーごとの状態については、小さなセッション識別子をキーとしてサーバー側にデータを保存してください。