Learn-json-web-tokens: Traduzir Exemplo para Elixir

Criado em 25 mar. 2019  ·  4Comentários  ·  Fonte: dwyl/learn-json-web-tokens

Este tutorial é ótimo para JavaScript, mas seria _amaze_ tê-lo no Elixir de _primeiros_ principaiss para _entender_ como autenticar uma solicitação usando JWT.

Pendência

  • [] Investigue qual pacote de assinatura / verificação JWT podemos usar no Elixir
  • [] Escreva um servidor da web básico que requer um cabeçalho JWT Auth para acessar um recurso protegido
    Para um servidor Web Elixir básico, consulte: https://github.com/dwyl/hits-elixir (no phoenix! 😮)
  • [] Testes!
  • [] escreva isso em um arquivo chamado elixir-example.md

@RobStallion , discutimos isso brevemente na teleconferência de hoje.
Adicione quaisquer outros critérios de aceitação que considere relevantes.

enhancement help wanted technical

Comentários muito úteis

Todos 4 comentários

@nelsonic Estive revisando o código em /example para obter uma melhor compreensão de como ele funciona para que eu possa recriá-lo no elixir.

Acho que entendi a essência do que está acontecendo na maior parte.
Você cria algumas rotas no arquivo server.js e toda a lógica para essas rotas vem de helper.js .

Isso tudo é simples o suficiente para recriar no elixir (mesmo sem um servidor phx).

Eu encontrei alguns pacotes / módulos que são capazes de criar JWTs no elixir. Eles estão:

  • Jose
  • joken (usa jose como dep)
  • [guardião] (usa jose como um dep. Mais um pacote de autenticação do que apenas um jwt)
  • yajwt (tem apenas jason como um dep. O pacote menos usado mencionado e não parece ser atualizado / mantido com a freqüência dos outros.)

Até agora, usei apenas joken mas foi bastante simples criar um JWT com ele ...

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

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

Histórico....

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

A função verify_and_validate também garante que o JWT não foi adulterado. Se criarmos um JWT com o segredo padrão e, em seguida, tentarmos descriptografá-lo com um segredo diferente, obteremos um erro ...
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)

obtemos o seguinte erro ...

image

Isso significa que podemos usar essas funções para criar e verificar nossos JWTs.

A parte que não tenho certeza de como replicar é esta , enviar o JWT para o cliente.

Posso enviar para o cliente no argumento assigns da função render assim ...

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

nesse ponto, poderíamos armazená-lo em localStorage .

Ainda não mencionei como enviaremos o JWT de volta ao servidor, mas presumo que podemos fazer isso com js no front end, se não houver uma maneira "limpa" de fazer isso usando o phoenix forms. (Eu não vi um exemplo de um aplicativo Phoenix usando o modelo Phoenix para enviar jwt de volta ao servidor, o que me leva a pensar que não está "limpo")

@RobStallion _consider_ usando https://hexdocs.pm/plug/Plug.Conn.html put_private/3 para salvar o JTW como auth_token . Para obter um exemplo de implementação, consulte: /lib/expected/plugs.ex#L88
LMK se você quiser caminhar + falar sobre isso a qualquer momento esta manhã. 🤙

Fazendo uma pequena pausa agora. Voltará em alguns dias

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

joepie91 picture joepie91  ·  18Comentários

sarneeh picture sarneeh  ·  3Comentários

KumarS-Naveen picture KumarS-Naveen  ·  3Comentários

rhewitt22 picture rhewitt22  ·  5Comentários

NE-SmallTown picture NE-SmallTown  ·  5Comentários