Аутентифицировать 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 настройка, чтобы ваш токен мог быть правильно проанализирован.

Другие вопросы по тегам