Параметр allow_credentials
Параметр allow_credentials применяется
к промежуточному слою CORSMiddleware
и управляет передачей учётных данных
при кросс-доменных запросах.
Учётные данные - это cookies,
заголовки авторизации
и TLS-сертификаты клиента.
Параметр принимает значение True
или False и по умолчанию равен False.
Когда он включён,
сервер добавляет в ответ заголовок
Access-Control-Allow-Credentials: true,
а браузер начинает передавать cookies
и заголовок Authorization.
Важно помнить:
при allow_credentials=True
нельзя использовать звёздочку '*'
в параметрах allow_origins,
allow_methods и allow_headers.
Нужно перечислять конкретные источники,
методы и заголовки.
Иначе браузер отклонит ответ,
хотя сервер его отправит.
Синтаксис
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_credentials=True,
...
)
Параметр передаётся именованным аргументом
при добавлении промежуточного слоя
через метод add_middleware.
Пример
Давайте включим передачу учётных данных для одного конкретного источника:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['http://localhost:3000'],
allow_credentials=True,
allow_methods=['GET', 'POST'],
allow_headers=['Authorization', 'Content-Type'],
)
@app.get('/')
def index():
return {'text': 'hello'}
Теперь браузер сможет отправлять cookies
и заголовок Authorization
с адреса http://localhost:3000.
Сервер вернёт заголовок:
Access-Control-Allow-Credentials: true
Пример
Давайте посмотрим, что произойдёт,
если оставить значение по умолчанию False:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=False,
allow_methods=['*'],
allow_headers=['*'],
)
@app.get('/')
def index():
return {'text': 'hello'}
В этом случае заголовок
Access-Control-Allow-Credentials
в ответе отсутствует,
а cookies и заголовок Authorization
браузер не передаст.
Пример
Давайте проверим работу параметра на нескольких разрешённых источниках:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=[
'http://localhost:3000',
'https://example.com',
],
allow_credentials=True,
allow_methods=['GET', 'POST', 'PUT', 'DELETE'],
allow_headers=['Authorization', 'Content-Type'],
)
@app.get('/user')
def user():
return {'name': 'abcde'}
Результат выполнения запроса
с адреса http://localhost:3000:
{"name": "abcde"}
При этом ответ содержит заголовок
Access-Control-Allow-Credentials: true
и конкретный источник
Access-Control-Allow-Origin
вместо звёздочки.
Смотрите также
-
класс
CORSMiddleware,
который настраивает кросс-доменные запросы -
параметр
allow_origins,
который задаёт разрешённые источники запросов -
параметр
allow_methods,
который задаёт разрешённые HTTP-методы -
параметр
allow_headers,
который задаёт разрешённые заголовки запроса