Este tutorial es excelente para JavaScript, pero sería _amaze_ tenerlo en Elixir de _first_ principals para _comprender_ cómo autenticar una solicitud usando JWT.
elixir-example.md
@RobStallion discutimos brevemente esto en la llamada de hoy.
Agregue cualquier otro criterio de aceptación que considere relevante.
@nelsonic He estado revisando el código en /example
para comprender mejor cómo funciona y poder recrearlo en elixir.
Creo que he entendido la esencia de lo que está sucediendo en su mayor parte.
Creas algunas rutas en el archivo helper.js .
Todo esto es lo suficientemente sencillo como para recrearlo en elixir (incluso sin un servidor phx).
Encontré algunos paquetes / módulos que son capaces de crear JWT en elixir. Ellos son:
jason
como depósito. Se menciona el paquete menos usado y no parece actualizarse / mantenerse con tanta frecuencia como los demás).Hasta ahora solo he usado joken
pero fue bastante sencillo crear un JWT con él ...
{:ok, token, _} = LearnJwt.Token.generate_and_sign(%{user_id: 1})
IO.inspect(token)
LearnJwt.Token.verify_and_validate!(token)
|> IO.inspect(label: "===> ")
registros ....
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJhdWQiOiJKb2tlbiIsImV4cCI6MTU1MzYzODYyMCwiaWF0IjoxNTUzNjMxNDIwLCJpc3MiOiJKb2tlbiIsImp0aSI6IjJtN3BuMnQ2MDBmMWN1Z3ZlazAwMDA1MyIsIm5iZiI6MTU1MzYzMTQyMH0.HQ-AQjvnIO7tIJF2joB45BJj7oLEznYSKUHZdMf9qe0"
===> : %{
"aud" => "Joken",
"exp" => 1553638620,
"iat" => 1553631420,
"iss" => "Joken",
"jti" => "2m7pn2t600f1cugvek000053",
"nbf" => 1553631420,
"user_id" => 1
}
La función verify_and_validate
también se asegura de que el JWT no haya sido manipulado. Si creamos un JWT con el secreto predeterminado y luego intentamos descifrarlo con un secreto diferente obtenemos un error ...
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)
obtenemos el siguiente error ...
Esto significa que podemos usar estas funciones para crear y verificar nuestros JWT.
La parte de la que no estoy completamente seguro de cómo replicar es esta : enviar el JWT al cliente.
Puedo enviarlo al cliente en el argumento de asignaciones de la función de renderizado así ...
render(conn, "index.html", jwt: token)
en ese momento podríamos almacenarlo en localStorage
.
Todavía no he mencionado cómo enviaremos el JWT de vuelta al servidor, pero supongo que podemos hacer esto con js en el front-end si no hay una forma "limpia" de hacerlo usando formularios phoenix. (No he visto un ejemplo de una aplicación phoenix que use plantillas phoenix para enviar jwt al servidor, lo que me lleva a pensar que no está "limpio")
@RobStallion _considere_ usar https://hexdocs.pm/plug/Plug.Conn.html put_private/3
para guardar el JTW como auth_token
. Para ver un ejemplo de implementación, consulte: /lib/expected/plugs.ex#L88
LMK si quieres caminar + hablar en cualquier momento esta mañana. 🤙
¿Ha leído: https://hexdocs.pm/plug/Plug.Session.COOKIE.html ? 💭
Tomando un breve descanso de esto por ahora. Volveré en un par de días.
Comentario más útil
¿Ha leído: https://hexdocs.pm/plug/Plug.Session.COOKIE.html ? 💭