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로 종료합니다.