我做了一个项目,可以在这里找到:
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"}
似乎很新,文档很差。
答案 0 :(得分:1)
信不信由你,但Guardian是一个非常有文化记录的图书馆,它在Elixir和Phoenix项目中非常受欢迎。
请检查this article以获取简单的API身份验证。
你究竟想要放header
?您应该使用Guardian已经定义的函数。
Guardian.encode_and_sign会返回{:ok,token,map},您需要将此令牌传递给标头。 然后,监护人使用期望令牌形式为
的插件VerifyHeaderAuthorization: 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中有一个拼写错误。现在一切都按预期工作了。