์ด ํํ ๋ฆฌ์ผ์ JavaScript์ ์ ํฉํ์ง๋ง JWT๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ธ์ฆํ๋ ๋ฐฉ๋ฒ์ _first_ principals์์ _understand_๊น์ง Elixir์ ํฌํจ์ํค๋ ๊ฒ์ _๋๋ผ์ธ ๊ฒ์ ๋๋ค.
elixir-example.md
๋ผ๋ ํ์ผ์ ์์ฑํ์ญ์์ค.@RobStallion ์ค๋ ํตํ์์ ์ด์ ๋ํด ๊ฐ๋ตํ๊ฒ ๋
ผ์ํ์ต๋๋ค.
๊ด๋ จ์ฑ์ด ์๋ค๊ณ ์๊ฐ๋๋ ๊ธฐํ ํ์ฉ ๊ธฐ์ค์ ์ถ๊ฐํ์ญ์์ค.
@nelsonic ์ ๋ /example
์ ์ฝ๋๋ฅผ ๊ฒํ ํ์ฌ Elixir ์์ ์ฝ๋๋ฅผ ๋ค์ ๋ง๋ค๊ธฐ ์ํด ์๋ ๋ฐฉ์์ ๋ ์ ์ดํดํ์ต๋๋ค.
๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋๋ถ๋ถ ์ดํดํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
server.js ํ์ผ์ ๋ช ๊ฐ์ง ๊ฒฝ๋ก๋ฅผ ๋ง๋ค๊ณ ์ด๋ฌํ ๊ฒฝ๋ก์ ๋ํ ๋ชจ๋ ๋
ผ๋ฆฌ๋ helper.js ์์
์ด๊ฒ์ ๋ชจ๋ Elixir์์ ๋ค์ ์์ฑํ๊ธฐ์ ์ถฉ๋ถํ ๊ฐ๋จํฉ๋๋ค(phx ์๋ฒ ์์ด๋).
Elixir์์ JWT๋ฅผ ์์ฑํ ์ ์๋ ๋ช ๊ฐ์ง ํจํค์ง/๋ชจ๋์ ์ฐพ์์ต๋๋ค. ๊ทธ๋ค์:
jason
dep. ์ธ๊ธ๋ ๊ฐ์ฅ ์ ๊ฒ ์ฌ์ฉ๋ ํจํค์ง์ด๋ฉฐ ๋ค๋ฅธ ํจํค์ง๋งํผ ์์ฃผ ์
๋ฐ์ดํธ/์ ์ง๋์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.)์ง๊ธ๊น์ง 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๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด๋ this ์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด render ํจ์์ assign ์ธ์๋ก ํด๋ผ์ด์ธํธ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
render(conn, "index.html", jwt: token)
์ด ์์ ์์ localStorage
์ ์ฅํ ์ ์์ต๋๋ค.
JWT๋ฅผ ์๋ฒ๋ก ๋ค์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์์ง ๋ค๋ฃจ์ง ์์์ง๋ง phoenix ์์์ ์ฌ์ฉํ์ฌ "๊นจ๋ํ" ๋ฐฉ๋ฒ์ด ์๋ ๊ฒฝ์ฐ ํ๋ฐํธ ์๋์์ js๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ์ํํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. (์ ๋ phoenix ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ jwt๋ฅผ ์๋ฒ๋ก ๋ค์ ๋ณด๋ด๋ phoenix ์์ฉ ํ๋ก๊ทธ๋จ์ ํ ์๋ฅผ ๋ณธ ์ ์ด ์์ผ๋ฏ๋ก "๊นจ๋ํ" ๊ฒ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.)
@RobStallion ์ JTW๋ฅผ auth_token
๋ก ์ ์ฅํ๊ธฐ ์ํด https://hexdocs.pm/plug/Plug.Conn.html put_private/3
์ ์ฌ์ฉํ์ฌ _๊ณ ๋ ค ํ์ญ์์ค_. ๊ตฌํ ์๋ /lib/expected/plugs.ex#L88์ ์ฐธ์กฐํ์ญ์์ค.
์ค๋ ์์นจ์ ์๋ฌด ๋๋ ๊ฑธ์ผ๋ฉด์ ์ด์ผ๊ธฐํ๊ณ ์ถ๋ค๋ฉด LMK๋ฅผ ์ฌ์ฉํ์ธ์. ๐ค
https://hexdocs.pm/plug/Plug.Session.COOKIE.html์ ์ฝ์ด ๋ณด์ จ์ต๋๊น? ๐ญ
๋น๋ถ๊ฐ์ ์ ์ ์ฌ๊ณ ์์ต๋๋ค. ๋ฉฐ์น ํ์ ๋ค์ ์ฌ ๊ฒ์ด๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
https://hexdocs.pm/plug/Plug.Session.COOKIE.html์ ์ฝ์ด ๋ณด์ จ์ต๋๊น? ๐ญ