Learn-json-web-tokens: Beispiel in Elixier übersetzen

Erstellt am 25. März 2019  ·  4Kommentare  ·  Quelle: dwyl/learn-json-web-tokens

Dieses Tutorial ist großartig für JavaScript, aber es wäre _amaze_, es in Elixir von _ersten_ Prinzipalen bis hin zu _verstehen_, wie man eine Anfrage mit JWT authentifiziert, zu haben.

Machen

  • [ ] Untersuchen Sie, welches JWT-Signierungs-/Verifizierungspaket wir in Elixir verwenden können
  • [ ] Schreiben Sie einen einfachen Webserver, der einen JWT Auth-Header benötigt, um auf eine geschützte Ressource zuzugreifen
    Für einen einfachen Elixir-Webserver siehe: https://github.com/dwyl/hits-elixir (kein Phoenix! 😮)
  • [ ] Tests!
  • [ ] schreibe dies in eine Datei namens elixir-example.md

@RobStallion wir haben dies heute bei dem Anruf kurz besprochen.
Bitte fügen Sie alle anderen Akzeptanzkriterien hinzu, die Sie für relevant halten.

enhancement help wanted technical

Hilfreichster Kommentar

Alle 4 Kommentare

@nelsonic Ich habe den Code in /example überprüft, um ein besseres Verständnis davon zu bekommen, wie er funktioniert, damit ich ihn in Elixir neu erstellen kann.

Ich glaube, ich habe den Kern dessen, was passiert, größtenteils verstanden.
Sie erstellen einige Routen in der Datei server.js und die gesamte Logik für diese Routen stammt von helper.js .

Dies ist alles einfach genug, um es in elixir (auch ohne phx-Server) neu zu erstellen.

Ich habe einige Pakete/Module gefunden, die JWTs in elixir erstellen können. Sie sind:

  • jose
  • Joken (benutzt Jose als Dep)
  • [guardian] (benutzt Jose als Dep. Eher ein Authentifizierungspaket als nur ein jwt)
  • yajwt (hat nur jason als dep. am wenigsten benutztes Paket erwähnt und scheint nicht so oft aktualisiert/gepflegt zu werden wie die anderen.)

Bisher habe ich nur joken aber es war ziemlich einfach, damit ein JWT zu erstellen ...

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

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

Protokolle....

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

Die Funktion verify_and_validate stellt außerdem sicher, dass das JWT nicht manipuliert wurde. Wenn wir ein JWT mit dem Standardgeheimnis erstellen und dann versuchen, es mit einem anderen Geheimnis zu entschlüsseln, erhalten wir eine Fehlermeldung ...
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)

wir erhalten folgenden Fehler...

image

Das bedeutet, dass wir diese Funktionen verwenden können, um unsere JWTs zu erstellen und zu verifizieren.

Der Teil, bei dem ich nicht ganz sicher bin, wie er repliziert werden soll, ist das Senden des JWT an den Client.

Ich kann es im Assigns-Argument der Render-Funktion so an den Client senden ...

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

zu diesem Zeitpunkt könnten wir es in localStorage speichern.

Ich habe noch nicht angesprochen, wie wir das JWT an den Server zurücksenden, aber ich gehe davon aus, dass wir dies mit js am Frontend tun können, wenn es keine "saubere" Möglichkeit gibt, dies mit Phoenix-Formularen zu tun. (Ich habe kein Beispiel für eine Phoenix-Anwendung gesehen, die Phoenix-Templating verwendet, um jwt zurück an den Server zu senden, was mich zu der Annahme führt, dass es nicht "sauber" ist.)

@RobStallion bitte _erwägen__ Sie mit https://hexdocs.pm/plug/Plug.Conn.html put_private/3 um das JTW als auth_token zu speichern. Ein Implementierungsbeispiel finden Sie unter: /lib/expected/plugs.ex#L88
LMK, wenn Sie es heute Morgen zu einem beliebigen Zeitpunkt durchgehen möchten. 🤙

Machen Sie jetzt eine kurze Pause davon. Werde in ein paar Tagen wiederkommen

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

joepie91 picture joepie91  ·  18Kommentare

nelsonic picture nelsonic  ·  5Kommentare

rhewitt22 picture rhewitt22  ·  5Kommentare

KumarS-Naveen picture KumarS-Naveen  ·  3Kommentare

rjmk picture rjmk  ·  9Kommentare