microdot.auth — HTTP 인증

라우트를 HTTP 인증 뒤에 두어 접근을 제어하는 데코레이터입니다. 두 가지 종류가 있습니다. 브라우저가 기본적으로 프롬프트를 띄우는 Authorization: Basic <base64> 방식을 위한 BasicAuth 와, API가 사용하는 Authorization: Bearer <token> 방식을 위한 TokenAuth 입니다.

두 클래스 모두 공통 BaseAuth 기반 클래스에서 파생됩니다. 애플리케이션은 인증 객체를 생성하고, authenticate() 로 인증 콜백을 등록한 다음, 보호할 라우트를 해당 인증 인스턴스로 데코레이팅합니다.

class BasicAuth

class microdot.auth.BasicAuth(realm: str = 'Please login', charset: str = 'UTF-8', scheme: str = 'Basic', error_status: int = 401)

HTTP Basic 인증입니다. 인증되지 않은 요청이 보호된 라우트에 도달하면 브라우저가 사용자 이름 / 비밀번호 대화 상자를 띄우고, 이후 요청에 Authorization: Basic <base64(user:pass)> 를 보냅니다.

realm

브라우저가 프롬프트 옆에 표시하는 realm 문자열.

charset

WWW-Authenticate 챌린지에서 알리는 문자셋(charset).

scheme

인증 방식 이름. 기본값 'Basic'.

error_status

인증 실패 시 반환되는 HTTP 상태. 기본값 401.

authenticate(f)

자격 증명 검사를 등록하는 데코레이터입니다. f(request, username, password) 를 받아 인증된 사용자 객체(또는 자격 증명이 잘못된 경우 None)를 반환합니다. 반환된 객체는 request.g.current_user 에 저장됩니다.

basic = BasicAuth(realm='Camera')

@basic.authenticate
async def check(request, username, password):
    user = users.get(username)
    if user and user.check_password(password):
        return user
__call__(f)

라우트를 BasicAuth 인스턴스로 데코레이팅하면 해당 라우트가 보호됩니다:

@app.route('/admin')
@basic
def admin(request):
    return 'hello ' + request.g.current_user.name
optional(f)

__call__() 과 비슷하지만, 자격 증명이 없는 요청을 거부하지 않습니다. 핸들러는 여전히 실행되며 request.g.current_user 에는 인증된 사용자 또는 None 이 설정됩니다.

class TokenAuth

class microdot.auth.TokenAuth(header: str = 'Authorization', scheme: str = 'Bearer', error_status: int = 401)

Bearer 토큰 인증입니다. 클라이언트는 Authorization 헤더에 토큰을 보내고, 애플리케이션은 원하는 어떤 백엔드 저장소에 대해서든 이를 검증합니다.

header

토큰을 담는 헤더 이름. 기본값 'Authorization' 은 값이 Bearer <token> 일 것으로 예상하며, 커스텀 헤더는 토큰 값을 직접 담습니다.

scheme

Authorization 헤더의 인증 방식. 기본값 'Bearer'.

error_status

인증 실패 시의 HTTP 상태. 기본값 401.

authenticate(f)

토큰 검사를 등록하는 데코레이터입니다. f(request, token) 을 받아 사용자 객체 또는 None 을 반환합니다:

import jwt

tokens = TokenAuth()

@tokens.authenticate
async def check(request, token):
    try:
        claims = jwt.decode(token, SECRET)
    except jwt.exceptions.PyJWTError:
        return None
    return claims['sub']
errorhandler(f)

기본 401 응답을 재정의하는 데코레이터입니다. f 는 요청 객체를 받아 응답을 반환합니다(또는 중단).

__call__(f: Callable) Callable

라우트를 TokenAuth 인스턴스로 데코레이팅하면 해당 라우트가 보호됩니다. 유효한 토큰이 없는 요청은 거부됩니다(기본값 401, 또는 errorhandler() 가 반환한 값). 성공 시 인증된 사용자는 request.g.current_user 에 있습니다:

@app.get('/api/me')
@tokens
async def me(request):
    return {'user': request.g.current_user}

래핑된 핸들러를 반환합니다.

optional(f: Callable) Callable

__call__() 과 비슷하지만, 토큰이 없는 요청을 거부하지 않습니다. 핸들러는 여전히 실행되며 request.g.current_user 에는 인증된 사용자 또는 None 이 설정됩니다. 인증을 요구하지 않으면서도 호출자의 인증 여부에 따라 출력을 바꾸는 라우트에 유용합니다:

@app.get('/api/feed')
@tokens.optional
async def feed(request):
    if request.g.current_user:
        return personalized_feed(request.g.current_user)
    return public_feed()

래핑된 핸들러를 반환합니다.

class BaseAuth

class microdot.auth.BaseAuth

BasicAuthTokenAuth 의 공통 기반입니다. 커스텀 인증 방식은 이를 서브클래싱할 수 있습니다.

auth_callback: Callable | None

authenticate 를 통해 등록된 콜백입니다. 애플리케이션이 콜백을 등록하기 전까지는 None 입니다(함수를 @auth.authenticate 로 데코레이팅하는 것이 이를 설정합니다).

error_callback: Callable

인증 실패 시 보낼 응답을 반환하는 비동기 호출 가능 객체입니다. 생성자가 401 응답을 반환하는 기본값으로 설정합니다. TokenAuth 에서는 errorhandler 를 통해, 또는 커스텀 BaseAuth 서브클래스에서는 직접 교체할 수 있습니다.

데코레이팅된 라우트는 request.g.current_user 에 인증 콜백이 반환한 값이 채워집니다. 라우트 내부에서 이 속성을 검사하여 호출자를 식별하십시오.