Это руководство отлично подходит для JavaScript, но было бы _amaze_ иметь его в Elixir от _ первых_ участников, чтобы _ понять_, как аутентифицировать запрос с помощью JWT.
elixir-example.md
@RobStallion, мы кратко обсудили это сегодня на
Пожалуйста, добавьте любые другие критерии приемлемости, которые, по вашему мнению, уместны.
@nelsonic Я просматривал код в /example
чтобы лучше понять, как он работает, чтобы я мог воссоздать его в эликсире.
Думаю, я по большей части понял суть происходящего.
Вы создаете несколько маршрутов в файле server.js, и вся логика для этих маршрутов берется из
Все это достаточно просто, чтобы воссоздать в elixir (даже без phx-сервера).
Я нашел несколько пакетов / модулей, которые могут создавать JWT в elixir. Они есть:
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)
получаем следующую ошибку ...
Это означает, что мы можем использовать эти функции для создания и проверки наших 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, если вы хотите прогуляться + поговорите об этом в любой момент сегодня утром. 🤙
Вы читали: https://hexdocs.pm/plug/Plug.Session.COOKIE.html ? 💭
Сделаем пока небольшой перерыв. Вернусь через пару дней
Самый полезный комментарий
Вы читали: https://hexdocs.pm/plug/Plug.Session.COOKIE.html ? 💭