From ff8a0e6260d9b251a27a8c31a6baf81a988764fc Mon Sep 17 00:00:00 2001 From: Kevin ANATOLE Date: Sat, 18 Feb 2023 10:50:52 +0000 Subject: [PATCH] Login --- .../auth/error_response.ex | 3 +++ .../controllers/user_controller.ex | 13 +++++++++++++ lib/phoenix_api_template_web/router.ex | 14 ++++++++++++++ test_requests/login.http | 8 ++++++++ 4 files changed, 38 insertions(+) create mode 100644 lib/phoenix_api_template_web/auth/error_response.ex create mode 100644 test_requests/login.http diff --git a/lib/phoenix_api_template_web/auth/error_response.ex b/lib/phoenix_api_template_web/auth/error_response.ex new file mode 100644 index 0000000..cdf0f7f --- /dev/null +++ b/lib/phoenix_api_template_web/auth/error_response.ex @@ -0,0 +1,3 @@ +defmodule PhoenixApiTemplateWeb.Auth.ErrorResponse.Unauthorized do + defexception message: "Unauthorized", plug_status: 401 +end diff --git a/lib/phoenix_api_template_web/controllers/user_controller.ex b/lib/phoenix_api_template_web/controllers/user_controller.ex index d30d2f7..a347e0b 100644 --- a/lib/phoenix_api_template_web/controllers/user_controller.ex +++ b/lib/phoenix_api_template_web/controllers/user_controller.ex @@ -1,6 +1,7 @@ defmodule PhoenixApiTemplateWeb.UserController do use PhoenixApiTemplateWeb, :controller + alias PhoenixApiTemplateWeb.Auth.ErrorResponse.Unauthorized alias PhoenixApiTemplateWeb.Auth.Guardian alias PhoenixApiTemplate.Accounts alias PhoenixApiTemplate.Accounts.User @@ -24,6 +25,18 @@ defmodule PhoenixApiTemplateWeb.UserController do end end + def sign_in(conn, %{"email" => email, "password" => password}) do + case Guardian.authenticate(email, password) do + {:ok, user, token} -> + conn + |> put_status(:ok) + |> render("user_token.json", %{user: user, token: token}) + + {:error, :unauthorized} -> + raise Unauthorized, message: "Invalid credentials" + end + end + def show(conn, %{"id" => id}) do user = Accounts.get_user!(id) render(conn, "show.json", user: user) diff --git a/lib/phoenix_api_template_web/router.ex b/lib/phoenix_api_template_web/router.ex index ad38dbf..296039b 100644 --- a/lib/phoenix_api_template_web/router.ex +++ b/lib/phoenix_api_template_web/router.ex @@ -1,5 +1,18 @@ defmodule PhoenixApiTemplateWeb.Router do use PhoenixApiTemplateWeb, :router + use Plug.ErrorHandler + + defp handle_errors(conn, %{reason: %Phoenix.Router.NoRouteError{message: message}}) do + conn + |> json(%{errors: message}) + |> halt() + end + + defp handle_errors(conn, %{reason: %{message: message}}) do + conn + |> json(%{errors: message}) + |> halt() + end pipeline :api do plug(:accepts, ["json"]) @@ -10,5 +23,6 @@ defmodule PhoenixApiTemplateWeb.Router do get("/", DefaultController, :index) post("/register", UserController, :create) + post("/login", UserController, :sign_in) end end diff --git a/test_requests/login.http b/test_requests/login.http new file mode 100644 index 0000000..4163c75 --- /dev/null +++ b/test_requests/login.http @@ -0,0 +1,8 @@ +POST http://localhost:4000/api/login HTTP/1.1 +content-type: application/json + +{ + "email": "test4@yopmail.com", + "password": "yolo" +} + \ No newline at end of file