# Getting Started Ash Authentication Phoenix ### With Igniter This will also install `ash_authentication` if you haven't run that installer. ```sh mix igniter.install ash_authentication_phoenix ``` If you'd like to see only the changes that `ash_authentication_phoenix` makes, you can run: ```sh mix igniter.install ash_authentication # and then run mix igniter.install ash_authentication_phoenix ``` See the [AshAuthentication getting started guide](https://hexdocs.pm/ash_authentication/get-started.html) for information on how to add strategies and configure `AshAuthentication` if you have not already. ### Manual #### Router Setup `ash_authentication_phoenix` includes several helper macros which can generate Phoenix routes for you. For that you need to add 6 lines in the router module or just replace the whole file with the following code: **lib/example_web/router.ex** ```elixir defmodule ExampleWeb.Router do use ExampleWeb, :router use AshAuthentication.Phoenix.Router # <-------- Add this line pipeline :browser do plug :accepts, ["html"] plug :fetch_session plug :fetch_live_flash plug :put_root_layout, {ExampleWeb.Layouts, :root} plug :protect_from_forgery plug :put_secure_browser_headers plug :load_from_session # <-------- Add this line end pipeline :api do plug :accepts, ["json"] plug :load_from_bearer # <--------- Add this line end scope "/", ExampleWeb do pipe_through :browser get "/", PageController, :home # add these lines --> # Standard controller-backed routes auth_routes AuthController, Example.Accounts.User, path: "/auth" sign_out_route AuthController # Prebuilt LiveViews for signing in, registration, resetting, etc. # Leave out `register_path` and `reset_path` if you don't want to support # user registration and/or password resets respectively. sign_in_route(register_path: "/register", reset_path: "/reset", auth_routes_prefix: "/auth") reset_route [auth_routes_prefix: "/auth"] # <-- add these lines end ... end ``` #### AuthController While running `mix phx.routes` you probably saw the warning message that the `ExampleWeb.AuthController.init/1 is undefined`. Let's fix that by creating a new controller: **lib/example_web/controllers/auth_controller.ex** ```elixir defmodule ExampleWeb.AuthController do use ExampleWeb, :controller use AshAuthentication.Phoenix.Controller def success(conn, _activity, user, _token) do return_to = get_session(conn, :return_to) || ~p"/" conn |> delete_session(:return_to) |> store_in_session(user) # If your resource has a different name, update the assign name here (i.e :current_admin) |> assign(:current_user, user) |> redirect(to: return_to) end def failure(conn, _activity, _reason) do conn |> put_flash(:error, "Incorrect email or password") |> redirect(to: ~p"/sign-in") end def sign_out(conn, _params) do return_to = get_session(conn, :return_to) || ~p"/" conn |> clear_session() |> redirect(to: return_to) end end ``` ## Generated routes Given the above configuration you should see the following in your routes: ``` # mix phx.routes Generated example app auth_path GET /sign-in AshAuthentication.Phoenix.SignInLive :sign_in auth_path GET /sign-out ExampleWeb.AuthController :sign_out auth_path * /auth/user/password/register ExampleWeb.AuthController {:user, :password, :register} auth_path * /auth/user/password/sign_in ExampleWeb.AuthController {:user, :password, :sign_in} page_path GET / ExampleWeb.PageController :home ... ``` ### Customizing the generated routes If you're integrating AshAuthentication into an existing app, you probably already have existing HTML layouts you want to use, to wrap the provided sign in/forgot password/etc. forms. Liveviews provided by AshAuthentication.Phoenix will use the same root layout configured in your router's `:browser` pipeline, but it includes its own layout file primarily for rendering flash messages. If you would like to use your own layout file instead, you can specify this as an option to the route helpers, eg. ```elixir reset_route(layout: {MyAppWeb, :live}, auth_routes_prefix: "/auth") ``` ## Tailwind If you plan on using our default [Tailwind](https://tailwindcss.com/)-based components without overriding them you will need to modify your `assets/tailwind.config.js` to include the `ash_authentication_phoenix` dependency: **assets/tailwind.config.js** ```javascript // See the Tailwind configuration guide for advanced usage // https://tailwindcss.com/docs/configuration const plugin = require("tailwindcss/plugin"); module.exports = { content: [ "./js/**/*.js", "../lib/*_web.ex", "../lib/*_web/**/*.*ex", "../deps/ash_authentication_phoenix/**/*.*ex", // <-- Add this line ], theme: { extend: { colors: { brand: "#FD4F00", }, }, }, plugins: [ require("@tailwindcss/forms"), plugin(({ addVariant }) => addVariant("phx-no-feedback", [ ".phx-no-feedback&", ".phx-no-feedback &", ]), ), plugin(({ addVariant }) => addVariant("phx-click-loading", [ ".phx-click-loading&", ".phx-click-loading &", ]), ), plugin(({ addVariant }) => addVariant("phx-submit-loading", [ ".phx-submit-loading&", ".phx-submit-loading &", ]), ), plugin(({ addVariant }) => addVariant("phx-change-loading", [ ".phx-change-loading&", ".phx-change-loading &", ]), ), ], }; ``` ## Example home.html.heex If you've just created your application, you can replace the default Phoenix `home.html.eex` with a minimal example which has a top navbar. On the right side it shows the `@current_user` and a sign out button. If you are not signed in you will see a sign in button. **lib/example_web/controllers/page_html/home.html.heex** ```html
Hi #{user.email},
Click here to reset your password.
If you didn't request this change, please ignore this.
""") end # For simplicity, this module simply logs messages to the terminal. # You should replace it by a proper email or notification tool, such as: # # * Swoosh - https://hexdocs.pm/swoosh # * Bamboo - https://hexdocs.pm/bamboo # defp deliver(to, subject, body) do IO.puts("Sending email to #{to} with subject #{subject} and body #{body}") new() |> from({"Zach", "zach@ash-hq.org"}) # TODO: Replace with your email |> to(to_string(to)) |> subject(subject) |> put_provider_option(:track_links, "None") |> html_body(body) |> Example.Mailer.deliver!() end end ``` Your new reset password functionality is active. Visit [`localhost:4000/sign-in`](http://localhost:4000/sign-in) with your browser and click on the `Forgot your password?` link to trigger the reset password workflow.