我试图将信息从解析器功能传递到中间件,以便可以在响应中设置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
我希望能够按照此处记录的“ absinthe_before_send”方法设置Cookie:https://hexdocs.pm/absinthe_plug/Absinthe.Plug.html#module-before-send
什么是最好的方法?上面的方法对我来说似乎很直观,但是状态在解析后的中间件中不可用。
答案 0 :(得分:2)
您无法在解析器功能中更改分辨率。
但是,您可以在中间件中更改分辨率。这就是中间件的用途。解析器后中间件解析将具有一个value
字段,其中包含来自解析器功能的结果(无:ok
或:error
原子)。
您可以做的是从解析器函数返回state
和url
,然后在解析后的中间件中,从解析度value
字段中提取状态并重置解析度{ {1}}到URL。像这样:
value
答案 1 :(得分:1)
我认为您无法像现在那样更改分辨率。
说实话,我不明白为什么您不能仅使用中间件来进行设置。为什么您不能仅在中间件上生成?
但是,我可以看到一种实现方法。
@desc "Return api version"
field :version, :version_payload do
resolve(fn _, _ -> {:ok, %{version: OnCallAPI.version(), other: "Marcos"}} end)
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
如果您检查控制台,您将在other
上看到values
。像这样:
...
private: %{},
root_value: %{},
schema: OnCallAPIWeb.Schema,
source: %{},
state: :resolved,
value: %{other: "Marcos", version: "0.30.0-rc"}