0

我做了一个可以在这里找到的项目:

https://github.com/rootkc/phx_auth_api

当我尝试发布到:

http://0.0.0.0:4000/api/login

与身体:

{ "user": { "username": "kenneth", "password": "kenneth" } }

那是数据库中的用户。我得到回应:

{
"data": {
    "token": "eyJhbGciOiJIUzUxM[...]gbPVHTsSvrCA"
}

}

然后,当我将该令牌放入标题中时: 在具有 Guardian 管道插件Àuthorization: :token 的调用http://0.0.0.0:4000/api/users中,我收到消息:未经身份验证

我不知道,我做错了什么。这是我第一个真正的 Phoenix 项目,我尝试遵循各种指南,但{:guardian, "~> 1.0-beta"}似乎很新,文档很糟糕。

4

3 回答 3

1

信不信由你,Guardian 是一个文档齐全的库,它在 Elixir 和 Phoenix 项目中非常受欢迎。

请查看本文了解简单的 API 身份验证。

你到底想怎么放header?您应该使用 Guardian 已定义的功能。

Guardian.encode_and_sign返回您 {:ok, token, map} 并且您需要将此令牌传递给标头。然后,监护人使用插件VerifyHeader期望令牌在表单中

Authorization: token

如何混合使用监护功能完全取决于您,但上面的文章是非常好的介绍。

编辑 假设您正在运行Elixir 1.5.x,您可以尝试在 IEx 中运行您的服务器,然后调试正在发生的事情:iex -S mix phx.server. 只需使用break! controller_name.action_name并尝试在 webbrowser / postman 等中单击此操作。

您也可以通过这种方式调试 Guardian 功能。

编辑 2

PhxAuthApi.Auth.Guardian 中,您不会在任何地方对令牌进行编码,但在PhxAuthApi.Auth.Pipeline中,您要求它具有特定的声明,但您没有提供它们。

您通过创建无法正常工作的自定义模块来过度设计此身份验证。

于 2017-11-13T21:37:56.280 回答
0

你的管道中有这个:

plug Guardian.Plug.VerifyHeader, claims: %{"typ" => "access"}, realm: :none

这意味着您的标题需要是:

Authorization: none: <token>

因为这就是 Guardian.Plug.VerifyHeader 中的内容:

def init(opts \\ %{}) do
  opts_map = Enum.into(opts, %{})
  realm = Map.get(opts_map, :realm)
  if realm do
    {:ok, reg} = Regex.compile("#{realm}\:?\s+(.*)$", "i")
    Map.put(opts_map, :realm_reg, reg)
  else
    opts_map
  end
end

我猜您需要删除realm: :none设置,以便正确解析您的令牌。

于 2017-11-14T13:31:05.347 回答
0

我的Pipeline中有一个错字。现在一切都按预期工作。

于 2017-11-14T19:41:14.757 回答