使用Guardian 1和Phoenix 1.3验证JWT

时间:2017-11-13 20:41:12

标签: elixir phoenix-framework guardian

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

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 我收到了消息:unauthenticated

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

3 个答案:

答案 0 :(得分:1)

信不信由你,但Guardian是一个非常有文化记录的图书馆,它在Elixir和Phoenix项目中非常受欢迎。

请检查this article以获取简单的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中您要求对此进行编码,例如它有特别的主张,但你没有提供它们。

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

答案 1 :(得分: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设置,以便正确解析您的令牌。

答案 2 :(得分:0)

我的Pipeline中有一个拼写错误。现在一切都按预期工作了。