Аутентифицировать JWT с помощью Guardian 1 и Phoenix 1.3
Я сделал проект, который можно найти здесь:
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
вызова http://0.0.0.0:4000/api/users
который имеет заглушку конвейера Guardian, я получаю сообщение: неаутентифицированный
И я понятия не имею, что я делаю не так. Это мой первый настоящий проект Феникс, и я пытался следовать различным руководствам, но {:guardian, "~> 1.0-beta"}
кажется довольно новым, с плохой документацией.
3 ответа
Верьте или нет, но 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.Guardian вы нигде не кодируете токен, но в 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
настройка, чтобы ваш токен мог быть правильно проанализирован.