Learn-json-web-tokens: Перевести пример на Эликсир

Созданный на 25 мар. 2019  ·  4Комментарии  ·  Источник: dwyl/learn-json-web-tokens

Это руководство отлично подходит для JavaScript, но было бы _amaze_ иметь его в Elixir от _ первых_ участников, чтобы _ понять_, как аутентифицировать запрос с помощью JWT.

Сделать

  • [] Узнайте, какой пакет подписи / проверки JWT мы можем использовать в Elixir.
  • [] Напишите базовый веб-сервер, которому требуется заголовок JWT Auth для доступа к защищенному ресурсу.
    Для базового веб-сервера Elixir см .: https://github.com/dwyl/hits-elixir (без феникса! 😮)
  • [] Тесты!
  • [] запишите это в файл с именем elixir-example.md

@RobStallion, мы кратко обсудили это сегодня на
Пожалуйста, добавьте любые другие критерии приемлемости, которые, по вашему мнению, уместны.

enhancement help wanted technical

Самый полезный комментарий

Все 4 Комментарий

@nelsonic Я просматривал код в /example чтобы лучше понять, как он работает, чтобы я мог воссоздать его в эликсире.

Думаю, я по большей части понял суть происходящего.
Вы создаете несколько маршрутов в файле server.js, и вся логика для этих маршрутов берется из

Все это достаточно просто, чтобы воссоздать в elixir (даже без phx-сервера).

Я нашел несколько пакетов / модулей, которые могут создавать JWT в elixir. Они есть:

  • Хосе
  • joken (использует jose как деп)
  • [хранитель] (использует jose в качестве заместителя. Больше похоже на пакет аутентификации, чем просто jwt)
  • yajwt (только jason в качестве заместителя. Упоминается наименее используемый пакет, и, похоже, он не обновляется / обслуживается так часто, как другие.)

До сих пор я использовал только joken но создать JWT с его помощью было довольно просто ...

    {:ok, token, _} = LearnJwt.Token.generate_and_sign(%{user_id: 1})
    IO.inspect(token)

    LearnJwt.Token.verify_and_validate!(token)
    |> IO.inspect(label: "===> ")

журналы ....

"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJhdWQiOiJKb2tlbiIsImV4cCI6MTU1MzYzODYyMCwiaWF0IjoxNTUzNjMxNDIwLCJpc3MiOiJKb2tlbiIsImp0aSI6IjJtN3BuMnQ2MDBmMWN1Z3ZlazAwMDA1MyIsIm5iZiI6MTU1MzYzMTQyMH0.HQ-AQjvnIO7tIJF2joB45BJj7oLEznYSKUHZdMf9qe0"
===> : %{
  "aud" => "Joken",
  "exp" => 1553638620,
  "iat" => 1553631420,
  "iss" => "Joken",
  "jti" => "2m7pn2t600f1cugvek000053",
  "nbf" => 1553631420,
  "user_id" => 1
}

Функция verify_and_validate также следит за тем, чтобы JWT не был подделан. Если мы создадим JWT с секретом по умолчанию, а затем попытаемся расшифровать его с другим секретом, мы получим ошибку ...
config/dev.exs

config :joken,
  default_signer: "secret",
  testing: "test"

some_controller

    {:ok, token2, _} = LearnJwt.Token.generate_and_sign(%{user_id: 1}, :testing)
    LearnJwt.Token.verify_and_validate!(token2)

получаем следующую ошибку ...

image

Это означает, что мы можем использовать эти функции для создания и проверки наших JWT.

Часть, которую я не совсем уверен, как реплицировать, - это отправка JWT клиенту.

Я могу отправить его клиенту в аргументе присваивает функции рендеринга так ...

render(conn, "index.html", jwt: token)

в этот момент мы можем сохранить его в localStorage .

Я еще не коснулся того, как мы отправим JWT обратно на сервер, но я предполагаю, что мы можем сделать это с помощью js в интерфейсе, если нет «чистого» способа сделать это с помощью форм Phoenix. (Я не видел ни одного примера приложения Phoenix, использующего шаблон Phoenix для отправки jwt обратно на сервер, что заставляет меня думать, что оно не "чистое")

@RobStallion, _consider_, используя https://hexdocs.pm/plug/Plug.Conn.html put_private/3 чтобы сохранить JTW как auth_token . Пример реализации см .: /lib/expected/plugs.ex#L88
LMK, если вы хотите прогуляться + поговорите об этом в любой момент сегодня утром. 🤙

Сделаем пока небольшой перерыв. Вернусь через пару дней

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

NE-SmallTown picture NE-SmallTown  ·  5Комментарии

rhewitt22 picture rhewitt22  ·  5Комментарии

KumarS-Naveen picture KumarS-Naveen  ·  3Комментарии

joepie91 picture joepie91  ·  18Комментарии

nelsonic picture nelsonic  ·  5Комментарии