콘텐츠로 이동

인증

Starlette는 인증 및 권한을 처리하기 위한 간단하지만 강력한 인터페이스를 제공합니다. 적절한 인증 백엔드로 AuthenticationMiddleware 를 설치하면 엔드포인트에서 request.user 및 request.auth 인터페이스를 사용할 수 있습니다.

Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
Starlette. 가져오기에서 (
    인증, AuthenticationBackend, 인증 오류, 단순 사용자
)
Starlette.middleware에서 미들웨어 가져오기
Starlette.middle에서.인증 가져오기AuthenticationMiddleware
Starlette.에서 일반 텍스트 응답을 가져옵니다.
별자리에서. 라우팅 가져오기 경로
베이스64 가져오기
비나시 수입


클래스 기본 저자 백엔드(AuthenticationBackend):
    Async def 인증(자체, conn):
        "인증"이 연결에 없는 경우 헤더:
            반품

        Auth = .headers ["인증"]
        시도:
            구성표, 자격 증명 = .분할()
            만약 e.low ()! = '기본':
                반품
            디코딩 = base64.b64 디코딩(자격 증명).decode("ascii")
        제외(Value오류, UnicodeDecode오류, binascii. 오류) exc:
            인증 오류 올리기('잘못된 기본 인증 자격 증명')

        사용자 이름, _, 암호 = decoded.(":")
        # TODO: 여기에서 사용자 이름과 암호를 확인하려고 합니다.
        인증서 반환(["인증"]), 단순 사용자(사용자 이름)


Async def 홈페이지(요청):
    요청이 있는 경우.user.user는 인증되었습니다.
        일반 텍스트 응답을 반환합니다('안녕하세요', + 요청.user. _name)
    일반 텍스트 응답 반환('안녕하세요')

경로 = [
    경로("/", 엔드포인트 = 홈페이지)
]

미들웨어 = [
    미들웨어(AuthenticationMiddleware, backend=BasicAuthBackend())
]

App = Starlette(경로 = 경로, middleware=middleware)

사용자

AuthenticationMiddleware 설치가 완료되면 request.user 인터페이스를 엔드포인트 또는 기타 미들웨어와 함께 사용할 수 있습니다.

이 인터페이스는 사용자 모델에 포함된 다른 정보뿐만 아니라 두 가지 속성을 제공하는 BaseUser 의 하위 클래스를 상속해야 합니다.

  • .is_authenticated
  • .display_name

Starlette는 UnauthenticatedUser() 와 SimpleUser(username) 의 두 가지 내장 사용자 구현을 제공합니다.

인증 자격 증명

중요한 것은 인증 자격 증명은 사용자와 별도의 개념으로 취급되어야 한다는 것입니다. 인증 체계는 사용자 ID와 독립적으로 특정 권한을 제한하거나 부여할 수 있어야 합니다.

AuthCredentials 클래스는 request.auth 에서 노출되는 기본 인터페이스를 제공합니다.

  • .scopes

허가

권한은 엔드포인트 데코레이터로 구현되어 수신 요청에 필요한 인증 범위를 포함하도록 강제합니다.

Starlette. 인증 가져오기가 필요합니다.


@ 필요 ('인증')
비동기 def 대시보드(요청):
    ...

하나 이상의 필수 범위를 포함할 수 있습니다.

Starlette. 인증 가져오기가 필요합니다.


@ 필요 (['인증', 'admin'])
비동기 def 대시보드(요청):
    ...

기본적으로 권한이 부여되지 않은 경우 403 응답이 반환됩니다. 인증되지 않은 사용자로부터 URL 레이아웃에 대한 정보를 숨기는 것과 같이 사용자 지정하는 경우도 있습니다.

Starlette. 인증 가져오기가 필요합니다.


@ 요구 사항(['인증', 'admin'], stast_code=404)
비동기 def 대시보드(요청):
    ...

!!! WebSockets는 status_code 매개 변수를 지원하지 않습니다. 이러한 경우 항상 403(금지된) 상태 코드가 사용됩니다.

또는 인증되지 않은 사용자를 다른 페이지로 리디렉션할 수 있습니다.

Starlette. 인증 가져오기가 필요합니다.


Async def 홈페이지(요청):
    ...


@ 요구 사항('인증', 리디렉션 = '홈페이지')
비동기 def 대시보드(요청):
    ...

사용자를 리디렉션할 때 리디렉션할 페이지에는 next 쿼리 매개 변수에 원래 요청한 URL이 포함됩니다.

Starlette. 인증 가져오기가 필요합니다.
Starlette.에서 가져온 리디렉션 응답


@ 요구 사항('인증', 리디렉션 = '로그인')
비동기 def 관리자(요청):
    ...


비동기 def 로그인(요청):
    요청하면.방법 == "POST":
        # 이제 사용자가 인증되었으므로
        # 원래 요청 대상으로 보낼 수 있습니다.
        요청이 있는 경우.user.user는 인증되었습니다.
            다음 _ url = 요청.쿼리 _ params get ("다음")
            다음 경우_url:
                리디렉션 응답 반환(다음 _url)
            리디렉션 응답 반환("/")

클래스 기반 엔드포인트의 경우 데코레이터를 클래스 메서드로 묶어야 합니다.

Starlette. 인증 가져오기가 필요합니다.
Starlette.endpoint에서 HTTPEndpoint 가져오기


클래스 대시보드(HTTPEndpoint):
    @ 요구 사항("인증")
    Aync def get (자체, 요청):
        ...

사용자 지정 인증 오류 응답

인증 백엔드가 AuthenticationError 를 던질 때 전송되는 오류 응답을 사용자 지정할 수 있습니다.

Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
Starlette.middleware에서 미들웨어 가져오기
Starlette.middle에서.인증 가져오기AuthenticationMiddleware
스타렛에서. 요청 가져오기 요청
Starlette.에서 JSONResponse 가져오기


Def on_auth_ 오류(요청: 요청, exc: 예외):
    JSON 응답 반환({"error": str(exc)}, stast_code=401)

앱 = Starlette (
    미들웨어 = [
        미들웨어(AuthenticationMiddleware, backend=BasicAuthBackend(), on_error = on_auth_error),
    ],
)