Я использую встроенный интерфейс GraphiQL в Absinthe. Следующее:
pipeline :browser do
plug RemoteIp, headers: ~w[x-forwarded-for], proxies: ~w[]
plug :accepts, ["html", "json"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug :put_secure_browser_headers
end
scope "/graphiql" do
pipe_through :browser # Use the default browser stack
forward "/", Absinthe.Plug.GraphiQL,
schema: ApiWeb.Schema,
default_headers: {__MODULE__, :graphiql_headers},
context: %{pubsub: ApiWeb.Endpoint}
end
def graphiql_headers(conn) do
%{
"X-CSRF-Token" => Plug.CSRFProtection.get_csrf_token(),
}
end
Мне нужно, чтобы конечный пользователь вставил Authentication: Bearer <JWT>
в интерфейс, а затем нужно развернуть его для заголовка sub:, который содержит мой идентификатор пользователя, который мне нужно использовать в преобразователях.
Пользователь может настроить собственные заголовки, это не проблема. Если он затем выполнит запрос GraphSQL, интерфейс отправит POST-запрос в конечную точку / graphiql. Именно в этот момент я хочу вызвать несколько плагинов, которые проверяют JWT и получают информацию о пользователе.
Я думал, что могу использовать параметр default_headers, но, похоже, он вызывается только во время запросов GET.
Кажется, мне нужны разные конвейеры для GET и POST к конечной точке / graphiql, как мне этого добиться? Я, должно быть, делаю что-то не так ...
Обратите внимание, что если я использую один и тот же конвейер для GET и POST, JWT уже будет проверяться при простом посещении конечной точки в браузере, что мне не нужно.