Elixir Phoenix에 기본 인증 추가 + 일일 비밀번호

8250 단어 phoenixelixirauth
이 글에서는 Elixir Phoenix Framework에 기본 인증을 추가하는 방법과 매일 바뀌는 비밀번호를 사용하는 방법에 대해 알아봅니다.

이 방법은 가장 안전하지는 않지만 좋은 방법입니다.

일일 비밀번호



먼저 일일 비밀번호를 생성하는 함수를 생성합니다.

이와 같은 것입니다.


defmodule MyApp.Helpers.DailyPassword do  
  @doc """
  Generate a daily password.
  """
  def today_password do
    {year, month, day} =
      today()

    Timex.format!({year, month, day}, "{0D}{0M}{YY}")
    |> String.to_integer()
    |> Kernel.+(day * 17 - 5)
    |> Kernel.+(month * 13)
    |> Kernel.+(year * 17)
  end

  defp today, do: :calendar.local_time |> elem(0)
end


기본 인증 플러그





defmodule MyAppWeb.BasicAuth do
  import Plug.Conn
  @realm "Basic realm=\"Staging\""

  def init(opts),
    do: opts ++ [password: MyApp.Helpers.DailyPassword.today_password() |> to_string()]

  def call(conn, correct_auth) do
    case get_req_header(conn, "authorization") do
      ["Basic " <> attempted_auth] -> verify(conn, attempted_auth, correct_auth)
      _ -> unauthorized(conn)
    end
  end

  defp verify(conn, attempted_auth, username: username, password: password) do
    with ^attempted_auth <- encode(username, password) do
      conn
    else
      _ -> unauthorized(conn)
    end
  end

  defp encode(username, password), do: Base.encode64(username <> ":" <> password)

  defp unauthorized(conn) do
    conn
    |> put_resp_header("www-authenticate", @realm)
    |> send_resp(401, "unauthorized")
    |> halt()
  end
end


라우터



이제 router.ex에서 기본 인증을 구성해야 합니다.

pipeline :auth do
  plug MyAppWeb.BasicAuth, [username: "admin"]
end


그리고 우리가 원하는 곳 어디에서나 인증을 사용하십시오.

scope "/", MyAppWeb do
  pipe_through :auth

  ...
end


결론



Phoenix는 사용할 수 있는 기본 인증here the docs을 제공하지만 우리가 직접 구성할 수 있는 방법을 보는 것이 좋습니다.

좋은 웹페이지 즐겨찾기