Learn-json-web-tokens: Traducir ejemplo a elixir

Creado en 25 mar. 2019  ·  4Comentarios  ·  Fuente: dwyl/learn-json-web-tokens

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.

Que hacer

  • [] Investigue qué paquete de verificación / firma de JWT podemos usar en Elixir
  • [] Escriba un servidor web básico que requiera un encabezado de autenticación JWT para acceder a un recurso protegido
    Para obtener un servidor web básico de Elixir, consulte: https://github.com/dwyl/hits-elixir (¡no phoenix! 😮)
  • [] ¡Pruebas!
  • [] escribe esto en un archivo llamado elixir-example.md

@RobStallion discutimos brevemente esto en la llamada de hoy.
Agregue cualquier otro criterio de aceptación que considere relevante.

enhancement help wanted technical

Comentario más útil

Todos 4 comentarios

@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:

  • José
  • joken (usa jose como dep)
  • [guardian] (usa a jose como dep. Más un paquete de autenticación que un simple jwt)
  • yajwt (solo tiene 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 ...

image

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. 🤙

Tomando un breve descanso de esto por ahora. Volveré en un par de días.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

rjmk picture rjmk  ·  9Comentarios

sarneeh picture sarneeh  ·  3Comentarios

KumarS-Naveen picture KumarS-Naveen  ·  3Comentarios

rhewitt22 picture rhewitt22  ·  5Comentarios

nelsonic picture nelsonic  ·  5Comentarios