Я пытаюсь передать информацию из функции распознавателя на промежуточное программное обеспечение, чтобы в ответе я мог установить cookie.
Сценарий использования: я хочу создать ссылку авторизации Oauth2, которая позволяет клиенту начать поток Oauth2 с третьей стороной. Я хочу создать объект "состояния", который я могу указать в ответе как файл cookie.
Я пытался позвонить
%{resolution | context: state}
внутри распознавателя, но, к сожалению, это, похоже, не передает это состояние.
Вот упрощенный пример моей функции распознавателя
def get_oauth_link(_parent, _args, resolution) do
state = random_string(10)
part_one = "https://github.com/login/oauth/authorize"
part_two = "?client_id=XXX"
part_three = "&redirect_uri=http://localhost:3000/login/callback"
part_four = "&state=" <> state
part_five = "&scope=user:email"
url = part_one <> part_two <> part_three <> part_four <> part_five
# try to add the state to the resolution to
%{resolution | context: state}
{:ok, url}
end
А потом в моей схеме
@desc "Get oauth link"
field :oauthlink non_null(:string) do
resolve(&Resolvers.OauthResolver.get_oauth_link/3)
# middleware after resolution to set a cookie with the provided state
middleware fn resolution, _ ->
# Here i want to extract the state generated in
# the resolver and add to the context
IO.inspect(resolution, label: "Inside resolution")
end
end
Я ожидаю, что смогу установить cookie в методе "absinthe_before_send", как описано здесь: https://hexdocs.pm/absinthe_plug/Absinthe.Plug.html#module-before-send
Каков наилучший способ сделать это? Приведенный выше подход кажется мне интуитивно понятным, но состояние не доступно в промежуточном программном обеспечении после разрешения.