Аутентификация
Starlette предлагает простой, но мощный интерфейс для обработки аутентификации и разрешений. Как только вы установили AuthenticationMiddleware с соответствующим бэкэндом аутентификации, интерфейсы request.user и request.auth будут доступны в вашей конечной точке.
Из Starlette.applications Import Starlette
Аварийный режим (
AuthenticationBackend, AuthenticationError, SimpleUser
)
from Starlette.middleware import Middleware
from starlett.middleware.authentication import Authentication Middleware
from starlette.responses import PlainTextResponse
От Starlet.routing Import Route
Import base64
import binascii
class BasicAuthBackend(AuthenticationBackend):
async def authenticate(self, conn):
Если "Authorization" не в conn.headers:
Возврат
auth = conn.headers["Authorization"]
try:
cheme, credentials = auth slit ()
if scheme.lower () != 'basic':
Возвращение
decoded = base64.b64decode(credentials).decode("asci")
except (ValueError, UnicodeDecodeError, binasci.Error) as exc:
raise AuthenticationError ('Invalid basic auth credentials')
username, _, password = decoded.partition (":")
You'd Want to verify the username and password here.
return AuthCredentials(["authenticated"]), SimpleUser(username)
Async def homepage(request):
if request.user.is:
return PlainTextResponse ('Hello, ' + request.user.display_name)
return PlainTextResponse ('Hello, you')
routes = [
Route("/", endpoint=homepage)
]
middleware =(
Middleware(AuthenticationMiddleware, backend=BasicAuthBackend())
]
app = Starlette(routes=routes, middleware=middleware)
Пользователи
После завершения установки AuthenticationMiddleware интерфейс request.user будет доступен для конечных точек или других промежуточных компонентов.
Этот интерфейс должен наследовать подкласс BaseUser, который предоставляет два свойства, а также любую другую информацию, содержащуюся в пользовательской модели.
.is_authenticated.display_name
Starlette предлагает две встроенные пользовательские реализации:UnauthenticatedUser() и SimpleUser(username).
Удостоверение подлинности
Важно, чтобы учетные данные для аутентификации рассматривались как отдельная концепция пользователя. Программы аутентификации должны иметь возможность ограничивать или предоставлять определенные разрешения независимо от идентификации пользователя.
Класс AuthCredentials предоставляет основные интерфейсы, которыми подвергается request.auth:
.scopes
Полномочия
Разрешения реализуются в виде декоратора конечных точек, который заставляет входящие запросы включать требуемый диапазон аутентификации.
from starlett.authentication import requires
@requires ('authenticated')
async def dashboard(request):
...
Вы можете включить один или несколько требуемых диапазонов:
from starlett.authentication import requires
requires(['authenticated', 'admin'])
async def dashboard(request):
...
По умолчанию, ответ 403 возвращается, если разрешения не предоставлены. В некоторых случаях вы можете настроить это, например, скрыть информацию о макете URL от непроверенных пользователей.
from starlett.authentication import requires
requires(['authenticated', 'admin'], status_code =404)
async def dashboard(request):
...
!!! отмечает, что WebSockets не поддерживает параметр status_code. Для этих случаев всегда будет использоваться код состояния 403 (запрещено).
Или вы можете перенаправить непроверенных пользователей на другие страницы.
from starlett.authentication import requires
async def homepage(request):
...
requires ('authenticated', redirect ='homepage')
async def dashboard(request):
...
При перенаправлении пользователей страница, на которую вы перенаправляете, содержит URL-адрес, который они запросили, в параметрах запроса next:
from starlett.authentication import requires
from starlet.responses import RedirectResponse
@requires ('authenticated', redirect ='login')
async def admin(request):
...
async def login(request):
if request.method = "POST":
Теперь, когда пользователь является authenticated,
We Can Send Them to Their Original Request Destination
if request.user.is:
next_url = request.query_params.get ("next")
if next_url:
Return RedirectResponse(next_url)
return RedirectResponse("/")
Для конечных точек, основанных на классе, вы должны упаковать декораторы вокруг методов класса.
from starlett.authentication import requires
from Starlette.endpoints Import HTTPENDpoint
Классы Dashboard(HTTPENDpoint):
requires("authenticated")
async def get(self, request):
...
Пользовательские ответы на ошибки аутентификации
Вы можете настроить ответ на ошибку, отправленную при запуске AuthenticationError в бэкете аутентификации:
from Starlette.applications import Starlette
from Starlette.middleware import Middleware
from starlett.middleware.authentication import Authentication Middleware
Из starlette.requests import Request
from starlette. response import JSONResponse
defon_auth_error (request: Request, exc: Exception):
return JSONResponse({"error": str(exc)}, status_code =401)
Слайд (
middleware=[
Middleware(AuthenticationMiddleware, backend=BasicAuthBackend(), on_error = on_auth_error),
],
)