通过Guardian 1和Phoenix 1.3验证JWT



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

https://github.com/rootkc/phx_auth_api

当我试图张贴到:

http://0.0.0.0:4000/api/login

带机身:

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

这是数据库中的一个用户。我得到的回复是:

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

}

然后,当我将该令牌放入标头时:Àuthorization: :token具有Guardian管道插头的呼叫http://0.0.0.0:4000/api/users的我收到消息:未经验证的

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

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

请查看本文以获取简单的API身份验证。

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

Guardian.encode_and_sign返回您{:ok,token,map},您需要将此令牌传递到标头。然后,guardian使用插件VerifyHeader,该插件期望令牌的形式为

Authorization: token

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

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

您也可以通过这种方式调试Guardian函数。

编辑2

在PhxAuthApi.Auth.Guard中,您不会在任何地方对令牌进行编码,但在PhxAuthApi.Auth.Pipeline中,您请求例如它有特定的声明,但您没有提供这些声明。

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

您的管道中有以下内容:

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设置,以便可以正确解析您的令牌。

我的管道中有一个拼写错误。现在一切如预期。

最新更新