Python SDK

pip または uv で speedle 0.2.0 をインストールし、ローカルの Speedle または Speedle Cloud に対して is_allowed と check を呼び出します。

Python SDK は Python 3.10 以降が必要です。ランタイム依存関係は httpx のみです。同じ引数を持つ同期の Client と asyncio の AsyncClient を備えています。パッケージ: PyPI の speedle 0.2.0。リファレンス: speedle-sdk/python。

サンプルでは、SDK 概要 で説明されているポリシーをチェックします。

依存関係の追加

仮想環境で pip を使用する場合:

python3 -m venv .venv
. .venv/bin/activate
pip install speedle==0.2.0

または uv プロジェクトで uv を使用する場合:

uv add speedle==0.2.0

ローカルの Speedle の呼び出し

SDK 概要 の説明に従って Speedle を起動し、サンプルポリシーを作成します。このプログラムを main.py として保存します:

import sys

from speedle import Auth, Client, SpeedleError

try:
    with Client(
        backend="speedle",
        endpoint="http://localhost:6734",
        auth=Auth.none(),
        service_name="docs",
    ) as speedle:
        allowed = speedle.is_allowed("alice", "get", "/docs/public")
        print(f"alice get /docs/public: allowed={allowed}")

        decision = speedle.check("alice", "delete", "/docs/public")
        print(f"alice delete /docs/public: allowed={decision.allowed} reason={decision.reason!r}")
except SpeedleError as e:
    print(f"Speedle error: {e}", file=sys.stderr)
    sys.exit(1)

仮想環境で python main.py を実行するか、uv で実行します:

uv run main.py

出力:

alice get /docs/public: allowed=True
alice delete /docs/public: allowed=False reason=<Reason.NO_APPLICABLE_POLICIES: 3>

Speedle Cloud の呼び出し

Speedle Cloud はまもなく公開されます。

プログラムは SPEEDLE_SERVICE からサービス名を、SPEEDLE_TOKEN からサービスのトークンを読み取ります。SPEEDLE_ENDPOINT はデフォルトのエンドポイント https://cloud.speedle.io を上書きします。main.py を以下に置き換えます:

import os
import sys

from speedle import Auth, Client, SpeedleError

try:
    with Client(
        backend="speedle-cloud",
        endpoint=os.environ.get("SPEEDLE_ENDPOINT", "https://cloud.speedle.io"),
        auth=Auth.bearer(os.environ["SPEEDLE_TOKEN"]),
        service_name=os.environ["SPEEDLE_SERVICE"],
    ) as speedle:
        allowed = speedle.is_allowed("alice", "get", "/docs/public")
        print(f"alice get /docs/public: allowed={allowed}")

        decision = speedle.check("alice", "delete", "/docs/public")
        print(f"alice delete /docs/public: allowed={decision.allowed} reason={decision.reason!r}")
except SpeedleError as e:
    print(f"Speedle error: {e}", file=sys.stderr)
    sys.exit(1)

環境変数を設定して実行します。read -rs を使用すると、トークンがシェルの履歴や画面に表示されません:

export SPEEDLE_SERVICE=docs
read -rs SPEEDLE_TOKEN && export SPEEDLE_TOKEN
python main.py

サービスにサンプルポリシーが存在する場合の出力:

alice get /docs/public: allowed=True
alice delete /docs/public: allowed=False reason=<Reason.NO_APPLICABLE_POLICIES: 3>

トークンはサーバー側のシークレットです。ブラウザ、モバイルアプリ、またはデスクトップクライアントには絶対に配布しないでください。

エラー処理

拒否されたリクエストはエラーではありません。上記の delete 呼び出しのように、is_allowed は False を返し、check は allowed が false で理由を含む決定を返します。デフォルト設定では、呼び出しが決定を返せない場合、SDK は SpeedleError を発生させます。サンプルではそれをキャッチし、標準エラー出力に Speedle error: <message> を出力して終了ステータス 1 で終了します。