Spec-Zone.ru › Phoenix

Phoenix.Endpoint поведение

Исходный код

Определяет конечную точку Phoenix.

Конечная точка — это граница, где начинаются все запросы к вашему веб-приложению. Это также интерфейс, который приложение предоставляет базовым веб-серверам.

В целом конечная точка выполняет три задачи:

  • предоставляет обёртку для запуска и остановки конечной точки в составе дерева супервизии

  • определяет начальный конвейер plug, через который проходят запросы

  • содержит специфичную для веб-приложения конфигурацию

Конечные точки

Конечная точка — это просто модуль, определённый с помощью Phoenix.Endpoint. Если вы использовали генератор mix phx.new, конечная точка была автоматически создана в составе приложения:

defmodule YourAppWeb.Endpoint do
  use Phoenix.Endpoint, otp_app: :your_app

  # plug ...
  # plug ...

  plug YourApp.Router
end

Конечные точки необходимо явно запускать в составе дерева супервизии приложения. В сгенерированных приложениях конечные точки по умолчанию добавляются в дерево супервизии. Добавить конечную точку в дерево супервизии можно следующим образом:

children = [
  YourAppWeb.Endpoint
]

Конфигурация конечной точки

Все конечные точки настраиваются в среде приложения. Например:

config :your_app, YourAppWeb.Endpoint,
  secret_key_base: "kjoy3o1zeidquwy1398juxzldjlksahdk3"

Конфигурация конечной точки делится на две категории. Конфигурация времени компиляции считывается во время компиляции, и её изменение во время выполнения не оказывает никакого эффекта. Она в основном связана с обработкой ошибок.

Конфигурация времени выполнения считывается во время запуска приложения или после него. Её можно получить с помощью функции config/2:

YourAppWeb.Endpoint.config(:port)
YourAppWeb.Endpoint.config(:some_config, :default_value)

Конфигурация времени компиляции

Конфигурацию времени компиляции можно задать в config/dev.exs, config/prod.exs и так далее, но она не оказывает эффекта на config/runtime.exs:

  • :code_reloader — если задано значение true, включает перезагрузку кода. Список параметров конфигурации перезагрузчика кода см. в разделе Phoenix.CodeReloader.reload/1. Обратите внимание, что перезагрузка кода основана на файловой системе, поэтому при разработке нельзя одновременно запускать два экземпляра одного приложения с включённой перезагрузкой кода: они будут конкурировать друг с другом, и файлы фактически перекомпилирует только один из них. В таких случаях измените файлы конфигурации, чтобы перезагрузка кода была включена только в одном из приложений, или задайте переменной окружения MIX_BUILD_PATH разные каталоги сборки

  • :debug_errors — если задано значение true, использует возможности Plug.Debugger для отладки сбоев приложения. Рекомендуется задавать значение true только при разработке, поскольку это позволяет просматривать исходный код приложения во время отладки. По умолчанию задано значение false

  • :force_ssl — гарантирует, что данные никогда не отправляются по HTTP, перенаправляя все запросы на HTTPS. Ожидает список параметров, которые передаются в Plug.SSL. По умолчанию в HTTPS-запросах устанавливается заголовок "strict-transport-security", предписывающий браузерам всегда использовать HTTPS. Если поступает небезопасный запрос (HTTP), он перенаправляется на версию HTTPS с использованием :host, указанного в конфигурации :url. Чтобы динамически перенаправлять на host текущего запроса, задайте :host в конфигурации :force_ssl значение nil

Конфигурация времени выполнения

Приведённую ниже конфигурацию можно задать в config/dev.exs, config/prod.exs и так далее, а также в config/runtime.exs. Обычно, если необходимо настроить её с помощью переменных окружения системы, значения задаются в config/runtime.exs. Эти параметры также можно задать при запуске конечной точки в дереве супервизии, например, в {MyApp.Endpoint, options}.

  • :adapter — адаптер веб-сервера для обработки веб-запросов. См. раздел «Конфигурация адаптера» ниже

  • :cache_static_manifest — путь к файлу манифеста JSON, содержащему статические файлы и их хешированные версии. Обычно здесь указывается "priv/static/cache_manifest.json" — файл, автоматически создаваемый задачей mix phx.digest. Значением может быть строка с путём в файловой системе либо кортеж с именем приложения и путём внутри него.

  • :cache_static_manifest_latest — карта статических файлов, указывающая их хешированные версии. Она автоматически загружается из cache_static_manifest при запуске. Однако, если вы используете собственный механизм обработки статических файлов, это значение можно задать явно. Оно используется такими проектами, как LiveView, чтобы определить, использует ли клиент последние версии всех ресурсов.

  • :cache_manifest_skip_vsn — если задано значение true, не добавляет строку запроса "?vsn=d" при создании путей к статическим ресурсам. Эта строка запроса используется Plug.Static для установки длительных сроков действия, поэтому задавайте этому параметру значение true, только если для раздачи ресурсов не используется Plug.Static, например, если используется CDN. Если вы задаёте этот параметр, рассмотрите возможность также передать --no-vsn задаче mix phx.digest. По умолчанию задано значение false.

  • :check_origin — настройка :check_origin по умолчанию для транспортов. Возможные параметры см. в разделе socket/3. По умолчанию задано значение true.

  • :secret_key_base — секретный ключ, используемый как основа для генерации секретов шифрования и подписи данных. Например, по умолчанию для файлов cookie и токенов создаются подписи, но при необходимости их также можно шифровать. По умолчанию задано значение nil, поскольку ключ необходимо задавать отдельно для каждого приложения

  • :server — если задано значение true, запускает веб-сервер при старте дерева супервизии конечной точки. По умолчанию задано значение false. Задача mix phx.server автоматически задаёт этому параметру значение true

  • :url — конфигурация для генерации URL-адресов во всём приложении. Принимает параметры :host, :scheme, :path и :port. Все ключи, кроме :path, можно изменять во время выполнения. По умолчанию:

    [host: "localhost", path: "/"]

    Параметр :port должен быть целым числом или строкой. Параметр :host должен быть строкой.

    Параметр :scheme принимает значения "http" и "https". Значение по умолчанию определяется на основе параметра верхнего уровня :http или :https. Он полезен, когда Phoenix размещён за балансировщиком нагрузки или обратным прокси, где завершается SSL.

    Параметр :path можно использовать для переопределения корневого пути. Полезен, когда Phoenix размещён за обратным прокси с правилами перезаписи URL

  • :static_url — конфигурация для генерации URL-адресов статических файлов. Если параметр не задан, используется значение url. Принимает те же параметры, что и url

  • :watchers — набор наблюдателей, запускаемых вместе с сервером. Ожидает список кортежей, содержащих исполняемый файл и его аргументы. Наблюдатели гарантированно запускаются в каталоге приложения, но только если сервер включён (если только параметру конфигурации :force_watchers не задано значение true). Например, приведённый ниже наблюдатель запускает режим "watch" инструмента сборки webpack при запуске сервера. Можно настроить любой инструмент сборки или команду:

    [
      node: [
        "node_modules/webpack/bin/webpack.js",
        "--mode",
        "development",
        "--watch",
        "--watch-options-stdin"
      ]
    ]

    В конец списка можно добавить параметры :cd и :env, чтобы настроить наблюдателя:

    [node: [..., cd: "assets", env: [{"TAILWIND_MODE", "watch"}]]]

    Наблюдатель также может быть кортежем вида модуль-функция-аргументы, который будет вызван соответствующим образом:

    [another: {Mod, :fun, [arg1, arg2]}]

    Если задано значение false, наблюдателей можно отключить.

  • :force_watchers — если задано значение true, принудительно запускает наблюдателей, даже если параметру :server задано значение false.

  • :live_reload — конфигурация параметра живой перезагрузки. Для неё требуется параметр :patterns, содержащий список шаблонов файлов для отслеживания. Изменение этих файлов вызывает перезагрузку.

    live_reload: [
      url: "ws://localhost:4000",
      patterns: [
        ~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg)$",
        ~r"lib/app_web/(live|views)/.*(ex)$",
        ~r"lib/app_web/templates/.*(eex)$"
      ]
    ]
  • :pubsub_server — имя сервера pubsub, используемого в каналах и функциях широковещательной рассылки конечной точки. Сервер PubSub обычно запускается в дереве супервизии.

  • :render_errors — отвечает за отображение шаблонов при сбоях приложения. Например, если приложение аварийно завершает работу с ошибкой 500 при HTML-запросе, будет вызван render("500.html", assigns) в представлении, переданном в :render_errors. Чтобы указать отдельный модуль для обработки ошибок в каждом формате, можно задать список :formats. Пример:

    [formats: [html: MyApp.ErrorHTML], layout: false, log: :debug]
  • :log_access_url — выводит URL-адрес доступа после запуска сервера

Обратите внимание, что в Phoenix.Endpoint также можно хранить собственные настройки. Например, Phoenix LiveView ожидает собственную конфигурацию под ключом :live_view. В таких случаях обратитесь к документации соответствующего проекта.

Конфигурация адаптера

Phoenix позволяет выбрать адаптер веб-сервера. Вновь созданные приложения, сгенерированные задачей Mix phx.new, используют веб-сервер Bandit через адаптер Bandit.PhoenixAdapter. Если параметр adapter не задан, Phoenix для обратной совместимости с приложениями, созданными до Phoenix 1.7.8, использует Phoenix.Endpoint.Cowboy2Adapter.

Оба адаптера можно настроить аналогичным образом с помощью следующих двух параметров верхнего уровня:

  • :http — конфигурация HTTP-сервера. В зависимости от выбранного адаптера принимает все параметры, определённые в Bandit или Plug.Cowboy. По умолчанию задано значение false

  • :https — конфигурация HTTPS-сервера. В зависимости от выбранного адаптера принимает все параметры, определённые в Bandit или Plug.Cowboy. По умолчанию задано значение false

Кроме того, для веб-сервера Cowboy можно настроить дренирование соединений с помощью следующего параметра верхнего уровня (для Bandit это не требуется, поскольку дренирование соединений уже встроено):

  • :drainer — процесс дренирования ожидает завершения всех выполняющихся запросов при остановке приложения. Он принимает параметры :shutdown и :check_interval, определённые в Plug.Cowboy.Drainer. Обратите внимание, что дренирование не завершает существующие соединения, а лишь ожидает их завершения. Перед вызовом этого процесса собственное дренирование выполняется для сокетных соединений. Это связано с тем, что сокеты сохраняют состояние и о завершении их работы можно уведомить корректным образом, что позволяет распределить их остановку на более длительный период. Дополнительные сведения см. в документации к socket/3

API конечной точки

В предыдущем разделе мы использовали функцию config/2, которая автоматически создаётся в конечной точке. Ниже приведён список всех функций, автоматически определяемых в ней:

  • для работы с путями и URL-адресами: struct_url/0, url/0, path/1, static_url/0,static_path/1 и static_integrity/1

  • для получения сведений о времени выполнения, адресе и порте, на которых работает конечная точка: server_info/1

  • для широковещательной рассылки в каналы: broadcast/3, broadcast!/3, broadcast_from/4, broadcast_from!/4, local_broadcast/3 и local_broadcast_from/4

  • для настройки: start_link/1, config/2 и config_change/2

  • как того требует поведение Plug: Plug.init/1 и Plug.call/2

Сводка

Типы

event()
msg()
topic()

Колбэки

broadcast(topic, event, msg)

Рассылает msg как event в указанном topic всем узлам.

broadcast!(topic, event, msg)

Рассылает msg как event в указанном topic всем узлам.

broadcast_from(from, topic, event, msg)

Рассылает msg от указанного from как event в указанном topic всем узлам.

broadcast_from!(from, topic, event, msg)

Рассылает msg от указанного from как event в указанном topic всем узлам.

config key, default

Возвращает конфигурацию конечной точки по заданному ключу.

config_change(changed, removed)

Повторно загружает конфигурацию конечной точки при обновлении приложения.

host()

Возвращает хост из конфигурации :url.

local_broadcast(topic, event, msg)

Рассылает msg как event в указанном topic в пределах текущего узла.

local_broadcast_from(from, topic, event, msg)

Рассылает msg от указанного from как event в указанном topic в пределах текущего узла.

path(path)

Создаёт сведения о пути при маршрутизации к этой конечной точке.

script_name()

Возвращает имя скрипта из конфигурации :url.

server_info(scheme)

Возвращает адрес и порт, на которых работает сервер

start_link(keyword)

Запускает дерево супервизии конечной точки.

static_integrity(path)

Создаёт хеш целостности для статического файла в priv/static.

static_lookup(path)

Создаёт кортеж из двух элементов, содержащий static_path и static_integrity.

static_path(path)

Создаёт маршрут к статическому файлу в priv/static.

static_url()

Создаёт URL статического ресурса без сведений о пути.

struct_url()

Создаёт базовый URL конечной точки в виде структуры URI.

subscribe(topic, opts)

Подписывает вызывающую сторону на указанный топик.

unsubscribe(topic)

Отписывает вызывающую сторону от указанного топика.

url()

Создаёт базовый URL конечной точки без сведений о пути.

Функции

server?(otp_app, endpoint)

Проверяет, настроен ли запуск веб-сервера конечной точки.

socket(path, module, opts \\ [])

Определяет точку подключения websocket/longpoll для socket.

Типы

event()Исходный код

@type event() :: String.t()

msg()Исходный код

@type msg() :: map() | {:binary, binary()}

topic()Исходный код

@type topic() :: String.t()

Обратные вызовы

broadcast(topic, event, msg)Источник

@callback broadcast(topic(), event(), msg()) :: :ok | {:error, term()}

Отправляет msg как event в указанном topic всем узлам.

broadcast!(topic, event, msg)Источник

@callback broadcast!(topic(), event(), msg()) :: :ok

Отправляет msg как event в указанном topic всем узлам.

В случае сбоев вызывает исключение.

broadcast_from(from, topic, event, msg)Источник

@callback broadcast_from(from :: pid(), topic(), event(), msg()) :: :ok | {:error, term()}

Отправляет msg от указанного from как event в указанном topic всем узлам.

broadcast_from!(from, topic, event, msg)Источник

@callback broadcast_from!(from :: pid(), topic(), event(), msg()) :: :ok

Отправляет msg от указанного from как event в указанном topic всем узлам.

В случае сбоев вызывает исключение.

config key, defaultИсточник

@callback config(key :: atom(), default :: term()) :: term()

Получает конфигурацию конечной точки по указанному ключу.

config_change(changed, removed)Источник

@callback config_change(changed :: term(), removed :: term()) :: term()

Перезагружает конфигурацию конечной точки при обновлении приложения.

host()Источник

@callback host() :: String.t()

Возвращает хост из конфигурации :url.

local_broadcast(topic, event, msg)Источник

@callback local_broadcast(topic(), event(), msg()) :: :ok

Отправляет msg как event в указанном topic в пределах текущего узла.

local_broadcast_from(from, topic, event, msg)Источник

@callback local_broadcast_from(from :: pid(), topic(), event(), msg()) :: :ok

Отправляет msg от указанного from как event в указанном topic в пределах текущего узла.

path(path)Источник

@callback path(path :: String.t()) :: String.t()

Формирует информацию о пути при маршрутизации к этой конечной точке.

script_name()Источник

@callback script_name() :: [String.t()]

Возвращает имя скрипта из конфигурации :url.

server_info(scheme)Источник

@callback server_info(Plug.Conn.scheme()) ::
  {:ok,
   {:inet.ip_address(), :inet.port_number()} | :inet.returned_non_ip_address()}
  | {:error, term()}

Возвращает адрес и порт, на которых работает сервер

start_link(keyword)Источник

@callback start_link(keyword()) :: Supervisor.on_start()

Запускает дерево супервизии конечной точки.

Запускает кэш конфигурации конечной точки и, возможно, серверы для обработки запросов.

static_integrity(path)Источник

@callback static_integrity(path :: String.t()) :: String.t() | nil

Формирует хеш целостности для статического файла в priv/static.

static_lookup(path)Источник

@callback static_lookup(path :: String.t()) ::
  {String.t(), String.t()} | {String.t(), nil}

Формирует кортеж из двух элементов, содержащий static_path и static_integrity.

static_path(path)Источник

@callback static_path(path :: String.t()) :: String.t()

Формирует маршрут к статическому файлу в priv/static.

static_url()Источник

@callback static_url() :: String.t()

Формирует статический URL без информации о пути.

struct_url()Источник

@callback struct_url() :: URI.t()

Формирует базовый URL конечной точки в виде структуры URI.

subscribe(topic, opts)Источник

@callback subscribe(topic(), opts :: Keyword.t()) :: :ok | {:error, term()}

Подписывает вызывающий процесс на указанную тему.

Список параметров см. в разделе Phoenix.PubSub.subscribe/3.

unsubscribe(topic)Источник

@callback unsubscribe(topic()) :: :ok | {:error, term()}

Отписывает вызывающий процесс от указанной темы.

url()Источник

@callback url() :: String.t()

Формирует базовый URL конечной точки без информации о пути.

Функции

server?(otp_app, endpoint)Источник

Проверяет, настроен ли запуск веб-сервера конечной точки.

  • otp_app — OTP-приложение, в котором запущена конечная точка, например :my_app
  • endpoint — модуль конечной точки, например MyAppWeb.Endpoint

Примеры

iex> Phoenix.Endpoint.server?(:my_app, MyAppWeb.Endpoint)
true

socket(path, module, opts \\ [])Источник

Определяет точку монтирования WebSocket/longpoll для socket.

Ожидает path, модуль socket и набор параметров. Модуль сокета обычно определяется с помощью Phoenix.Socket.

Поддержка соединений WebSocket и longpolling предусмотрена из коробки.

Параметры

  • :websocket — управляет конфигурацией WebSocket. По умолчанию — true. Может иметь значение false или быть списком ключевых слов с параметрами. Полный список см. в разделах «Общая конфигурация» и «Конфигурация WebSocket»

  • :longpoll — управляет конфигурацией longpoll. По умолчанию — false. Может иметь значение true или быть списком ключевых слов с параметрами. Полный список см. в разделах «Общая конфигурация» и «Конфигурация longpoll»

  • :drainer — список ключевых слов или пользовательская функция MFA, возвращающая список ключевых слов, например:

    {MyAppWeb.Socket, :drainer_configuration, []}

    параметры для завершения работы сокетов при остановке приложения. Цель — уведомить всех клиентов каналов (и LiveView) о необходимости переподключиться. Поддерживаются следующие параметры:

    • :batch_size — количество клиентов, уведомляемых одновременно в одной группе. По умолчанию — 10000.
    • :batch_interval — время в миллисекундах, отведённое на завершение одной группы. По умолчанию — 2000 мс.
    • :shutdown — максимально допустимое время в миллисекундах для обработки всех групп. По умолчанию — 30000 мс.
    • :log — уровень журнала для действий по завершению работы. По умолчанию используется параметр :log, переданный в use Phoenix.Socket или :info. Установите значение false, чтобы отключить ведение журнала.

    Например, если у вас 150 тыс. соединений, значения по умолчанию разделят их на 15 групп по 10 тыс. соединений. Обработка каждой группы занимает 2000 мс, прежде чем начнётся обработка следующей. В этом случае все действия будут выполнены чуть быстрее максимального времени завершения работы — 30000 мс. Поэтому при увеличении числа соединений не забудьте соответствующим образом настроить время завершения работы. Наконец, после запуска механизма завершения работы сокетов запустится механизм завершения работы HTTP/HTTPS-соединений нижнего уровня, применяемый ко всем соединениям. Установите значение false, чтобы отключить завершение работы.

  • auth_token — логическое значение, разрешающее использовать параметр auth_token клиента channels. Конкретный механизм передачи токена зависит от транспорта:

    • для транспорта WebSocket токен можно передать в заголовке Sec-WebSocket-Protocol.
    • для транспорта longpoll токен можно передать в заголовке Authorization.

    Токен доступен в connect_info как :auth_token.

    Пользовательские транспорты могут реализовывать собственный механизм.

Указанные ниже параметры также можно передать в use Phoenix.Socket. Заданные здесь значения имеют приоритет над значением в use Phoenix.Socket.

Примеры

socket "/ws", MyApp.UserSocket

socket "/ws/admin", MyApp.AdminUserSocket,
  longpoll: true,
  websocket: [compress: true]

Параметры пути

В путь можно включить переменные; они будут доступны в params, передаваемых сокету.

socket "/ws/:user_id", MyApp.UserSocket,
  websocket: [path: "/project/:project_id"]

Общая конфигурация

Конфигурацию ниже можно передать для обоих ключей: :websocket и :longpoll:

  • :path — путь для транспорта. По умолчанию используется имя транспорта ("/websocket" или "/longpoll")

  • :serializer — список сериализаторов сообщений. Дополнительные сведения см. в разделе Phoenix.Socket

  • :transport_log — указывает, должен ли транспортный уровень вести журнал и, если да, то с каким уровнем

  • :check_origin — проверять ли транспортному уровню источник запросов, если присутствует заголовок origin. Возможные значения: true, false, список разрешённых URI или функция, заданная кортежем MFA. По умолчанию используется значение настройки :check_origin в конфигурации конечной точки.

    Если задано значение true, заголовок проверяется на соответствие :host в YourAppWeb.Endpoint.config(:url)[:host].

    Если задано значение false и вы не проверяете сеанс в сокете, ваше приложение уязвимо для атак Cross-Site WebSocket Hijacking (CSWSH). Используйте этот параметр только в среде разработки, когда хост действительно неизвестен или когда обслуживаются клиенты, не отправляющие заголовок origin, например мобильные приложения.

    Также можно указать список явно разрешённых источников. Каждый источник может включать схему, хост и порт. Поддерживаются подстановочные знаки.

    check_origin: [
      "https://example.com",
      "//another.com:888",
      "//*.other.com"
    ]

    Или чтобы принимать любые источники, соответствующие хосту, порту и схеме соединения запроса:

    check_origin: :conn

    Или пользовательскую функцию MFA:

    check_origin: {MyAppWeb.Auth, :my_check_origin?, []}

    Функция MFA вызывается с запросом %URI{} в качестве первого аргумента, за которым следуют аргументы из списка MFA, и должна возвращать логическое значение.

  • :check_csrf — выполнять ли транспортному уровню проверку CSRF. Чтобы избежать атак «Cross-Site WebSocket Hijacking», должен быть включён хотя бы один из параметров check_origin и check_csrf. Если для обоих задать значение false, Phoenix вызовет исключение, однако отключить оба параметра всё же можно, передав пользовательскую функцию MFA в check_origin. В этом случае вы несёте ответственность за включение хотя бы одного из них. По умолчанию — true

  • :code_reloader — включить или отключить перезагрузчик кода. По умолчанию используется конфигурация конечной точки

  • :connect_info — список ключей, соответствующих данным, копируемым из транспорта и передаваемым в обратный вызов пользовательского сокета connect/3. Допустимые ключи см. в подразделе «Информация о подключении»

Информация о подключении

Допустимые ключи:

  • :peer_data — результат вызова Plug.Conn.get_peer_data/1

  • :trace_context_headers — список всех заголовков контекста трассировки. Поддерживаемые заголовки определены в спецификации W3C Trace Context. Эти заголовки необходимы таким библиотекам, как OpenTelemetry, чтобы извлекать информацию о распространении трассировки и определять, что этот запрос является частью выполняющейся трассировки большего размера.

  • :x_headers — все заголовки запроса, начинающиеся с "x-"

  • :uri — %URI{} с информацией из conn

  • :user_agent — значение заголовка запроса "user-agent"

  • {:session, session_config} — информация о сеансе из Plug.Conn. session_config обычно является точной копией аргументов, переданных в Plug.Session. Для проверки сеанса при подключении сокета в качестве параметра запроса необходимо передать "_csrf_token" со значением URI.encode_www_form(Plug.CSRFProtection.get_csrf_token()). Параметр запроса с CSRF-токеном можно изменить с помощью параметра :csrf_token_key.

    Кроме того, session_config может быть MFA, например {MyAppWeb.Auth, :get_session_config, []}, чтобы загружать конфигурацию во время выполнения.

После перечисленных выше допустимых ключей также можно указать произвольные ключевые слова — это удобно для передачи сокету пользовательской информации о подключении.

Например:

  socket "/socket", AppWeb.UserSocket,
      websocket: [
        connect_info: [:peer_data, :trace_context_headers, :x_headers, :uri, session: [store: :cookie]]
      ]

С произвольными ключевыми словами:

  socket "/socket", AppWeb.UserSocket,
      websocket: [
        connect_info: [:uri, custom_value: "abcdef"]
      ]

Где мои заголовки?

Из соображений безопасности Phoenix предоставляет ограниченный доступ к заголовкам соединения. WebSocket-соединения являются междоменными, поэтому, когда пользователь «Иван Иванов» посещает вредоносный сайт, этот сайт может открыть WebSocket-соединение с вашим приложением, а браузер охотно передаст данные аутентификации и cookie Ивана Иванова. Если принять эти данные как есть, вредоносный сайт получит полный контроль над WebSocket-соединением с вашим приложением, аутентифицированным от имени Ивана Иванова.

Чтобы защитить приложение, Phoenix ограничивает доступную сокету информацию о соединении и проверяет её. Это защищает приложение от подобных атак, но не позволяет обращаться к cookie и другим заголовкам из сокета. Вы можете получить доступ к сеансу, сохранённому в соединении, с помощью параметра :connect_info, если при подключении по WebSocket также передадите токен CSRF.

Конфигурация WebSocket

Следующая конфигурация применяется только к :websocket.

  • :timeout — тайм-аут, в течение которого WebSocket-соединения остаются открытыми после получения последних данных; по умолчанию 60_000 мс

  • :max_frame_size — максимально допустимый размер кадра в байтах; по умолчанию "infinity"

  • :fullsweep_after — максимальное количество сборок мусора до принудительной полной сборки для процесса сокета. Чтобы чаще очищать процессы транспортного уровня WebSocket, можно задать значение 0. Для настройки этого параметра требуется Erlang/OTP 24

  • :compress — включить ли сжатие каждого сообщения во всех кадрах данных; по умолчанию false

  • :subprotocols — список поддерживаемых подпротоколов WebSocket. Используется для заголовка ответа Sec-WebSocket-Protocol при рукопожатии; по умолчанию nil.

    Например:

    subprotocols: ["sip", "mqtt"]
  • :error_handler — пользовательский обработчик ошибок соединения. Если Phoenix.Socket.connect/3 возвращает кортеж {:error, reason}, обработчик ошибок вызывается с причиной ошибки. Для WebSocket обработчик ошибок должен быть кортежем MFA, принимающим Plug.Conn и причину ошибки и возвращающим Plug.Conn с ответом. Например:

    socket "/socket", MySocket,
        websocket: [
          error_handler: {MySocket, :handle_error, []}
        ]

    а возвращаемое значение {:error, :rate_limit} можно обработать в MySocket следующим образом:

    def handle_error(conn, :rate_limit), do: Plug.Conn.send_resp(conn, 429, "Too many requests")

Конфигурация longpoll

Следующая конфигурация применяется только к :longpoll:

  • :window_ms — время в миллисекундах (мс), в течение которого клиент может ожидать новые сообщения в запросе опроса. По умолчанию — 10_000.

  • :pubsub_timeout_ms — время в миллисекундах (мс), в течение которого запрос может ожидать ответа уровня pubsub. По умолчанию — 2000.

  • :crypto — параметры для проверки и подписания токена, принимаемые модулем Phoenix.Token. По умолчанию срок действия токенов составляет 2 недели

Пакет Hex Предварительный просмотр Hex Скачать версию ePub

Создано с помощью ExDoc (v0.40.3) для языка программирования Elixir

© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix.hexdocs.pm/Phoenix.Endpoint.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API