コンテンツにスキップ

認証

Starletteは、認証と権限を処理するためのシンプルで強力なインターフェイスを提供します。適切な認証バックエンドを使用して AuthenticationMiddleware をインストールすると、request.user と request.auth のインターフェイスがエンドポイントで利用できるようになります。

Starlette. applicationからStarletteをインポート
starletteからの認証インポート(
    認証情報、AuthenticationBackend、AuthenticationError、Simple User
)
ミドルウェアのインポート
starletteから。ミドルウェア。認証インポートAuthenticationMiddleware
starletteからPlainTextResponseをインポート
from starlette. routingインポートルート
base 64をインポート
binasciiをインポート


BasicAuthBackendクラス(AuthenticationBackend):
    async def認証(self, conn):
        conn. headerに"Authorization"がない場合:
            リターン

        auth=conn. headers["Authorization"]
        トライ:
            スキーム、資格情報=auth. split()
            if Scheme. lower()!='basic':
                リターン
            decode=base 64. b 64 decode(資格情報).decode("ascii")
        (ValueError, UnicodeDecodeError,binascii.Error)をexcとして除外します:
            AuthenticationError('無効な基本認証資格情報')を上げる

        ユーザー名、_、パスワード=デコードされたパーティション(":")
        #TODO:ここでユーザー名とパスワードを確認します。
        return認証情報(["認証済み"]), Simple User(ユーザ名)


async defホームページ(request):
    リクエストが認証された場合:
        return PlainTextResponse('Hello,'+request. user.display_name)
    return PlainTextResponse('こんにちは、あなた')

ルート=[
    ルート("/",エンドポイント=ホームページ)
]

ミドルウェア=[
    ミドルウェア(AuthenticationMiddleware,backend=BasicAuthBackend())
]

アプリ=Starlette(ルート=ルート、middleware=middleware)

ユーザー

AuthenticationMiddleware のインストールが完了すると、request.user インターフェイスはエンドポイントまたは他のミドルウェアで使用できるようになります。

このインターフェイスは、BaseUser のサブクラスを継承する必要があります。このサブクラスは、2つの属性と、ユーザーモデルに含まれるその他の情報を提供します。

  • .is_authenticated
  • .display_name

Starletteは、UnauthenticatedUser() と SimpleUser(username) の2つの組み込みユーザー実装を提供しています。

認証資格情報

重要なことは、認証クレデンシャルはユーザーとは別の概念として扱う必要があるということです。認証スキームは、ユーザーIDの制限とは独立して、または特定の権限を付与できる必要があります。

AuthCredentials クラスは、request.auth が公開する基本的なインターフェースを提供します。

  • .scopes

権限

権限は、着信要求に必要な認証範囲を含めるように強制するエンドポイントデコレータとして実装されます。

認証インポートが必要です


@必須('認証済み')
async defダッシュボード(request):
    ...

1つ以上の必要な範囲を含めることができます。

認証インポートが必要です


@必須(['認証済み','admin'])
async defダッシュボード(request):
    ...

デフォルトでは、権限が付与されていない場合に403の応答が返されます。これをカスタマイズしたい場合もあります。たとえば、認証されていないユーザーからURLレイアウトに関する情報を非表示にするなどです。

認証インポートが必要です


@必須(['認証済み','管理者'], status_code=404)
async defダッシュボード(request):
    ...

!!! 注意WebSocketsは status_code パラメータをサポートしていません。これらの場合、403(禁止)ステータスコードが常に使用されます。

または、認証されていないユーザーを別のページにリダイレクトすることもできます。

認証インポートが必要です


async defホームページ(request):
    ...


@必須('認証済み', redirect='ホームページ')
async defダッシュボード(request):
    ...

ユーザーをリダイレクトすると、ユーザーをリダイレクトするページには、next クエリパラメーターに最初に要求したURLが含まれます。

認証インポートが必要です
starletteからRedirect Responseをインポート


@必須('認証済み', redirect='ログイン')
async def admin(request):
    ...


async def log in(request):
    if request. method=="POST":
        ユーザーが認証されたので、
        #元のリクエスト先に送信できます。
        リクエストが認証された場合:
            next_url=request. query_params.get("next")
            if next_url:
                returnリダイレクトレスポンス(next_url)
            return Redirect Response("/")

クラスベースのエンドポイントの場合、クラスのメソッドの周りにデコレータをラップする必要があります。

認証インポートが必要です
from starlette. endpoints import HTTPEndpoint


クラスダッシュボード(HTTPEndpoint):
    @必須("認証済み")
    async def get(self, request):
        ...

カスタム認証エラー応答

認証バックエンドが AuthenticationError を起動したときに送信されるエラーレスポンスをカスタマイズできます。

Starlette. applicationからStarletteをインポート
ミドルウェアのインポート
starletteから。ミドルウェア。認証インポートAuthenticationMiddleware
インポートリクエスト
JSONResponseをインポートします。


def on_auth_error(request: Request,exc:Exception):
    return JSONResponse({"error": str(exc)}, status_code=401)

アプリ=Starlette(
    ミドルウェア=[
        ミドルウェア(AuthenticationMiddleware,backend=BasicAuthBackend(), on_error=on_auth_error),
    ],
)