Add login next url parameter for auth redirects
This commit is contained in:
@@ -9,7 +9,6 @@ defmodule SsoBsnWeb.UserSessionController do
|
|||||||
{:ok, user} ->
|
{:ok, user} ->
|
||||||
conn
|
conn
|
||||||
|> UserAuth.log_in_user(user) # TODO: pass through remember-me value?
|
|> UserAuth.log_in_user(user) # TODO: pass through remember-me value?
|
||||||
|> redirect(to: ~p"/users/settings")
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
dbg(error)
|
dbg(error)
|
||||||
conn
|
conn
|
||||||
@@ -32,4 +31,8 @@ defmodule SsoBsnWeb.UserSessionController do
|
|||||||
username: user.username
|
username: user.username
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def redirect_next(conn, %{ "next" => next }) do
|
||||||
|
conn |> redirect(external: next)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ defmodule SsoBsnWeb.UserLoginLive do
|
|||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
def mount(_params, _session, socket) do
|
def mount(params, _session, socket) do
|
||||||
{:ok, socket |> assign(form: to_form(%{"username" => "", "remember_me" => false}), authenticating: false)}
|
{:ok, socket |> assign(form: to_form(%{"username" => "", "remember_me" => false}), authenticating: false, next: params["next"])}
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("login", %{"username" => username}, socket) do
|
def handle_event("login", %{"username" => username}, socket) do
|
||||||
@@ -57,7 +57,7 @@ defmodule SsoBsnWeb.UserLoginLive do
|
|||||||
case Accounts.authenticate_user(socket.assigns.challenge, params) do
|
case Accounts.authenticate_user(socket.assigns.challenge, params) do
|
||||||
{:ok, user} ->
|
{:ok, user} ->
|
||||||
login_token = Accounts.generate_user_login_token(user)
|
login_token = Accounts.generate_user_login_token(user)
|
||||||
{:noreply, socket |> redirect(to: ~p"/users/log_in/#{login_token}")}
|
{:noreply, socket |> redirect(to: if next = socket.assigns.next do ~p"/users/log_in/#{login_token}?next=#{next}" else ~p"/users/log_in/#{login_token}" end)}
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:noreply, socket |> put_flash(:error, inspect(error))}
|
{:noreply, socket |> put_flash(:error, inspect(error))}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ defmodule SsoBsnWeb.Router do
|
|||||||
pipe_through :browser
|
pipe_through :browser
|
||||||
|
|
||||||
get "/", PageController, :home
|
get "/", PageController, :home
|
||||||
|
get "/redirect", UserSessionController, :redirect_next
|
||||||
end
|
end
|
||||||
|
|
||||||
# Other scopes may use custom stacks.
|
# Other scopes may use custom stacks.
|
||||||
@@ -56,7 +57,6 @@ defmodule SsoBsnWeb.Router do
|
|||||||
end
|
end
|
||||||
|
|
||||||
get "/users/log_in/:token", UserSessionController, :login
|
get "/users/log_in/:token", UserSessionController, :login
|
||||||
post "/users/log_in", UserSessionController, :create
|
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/", SsoBsnWeb do
|
scope "/", SsoBsnWeb do
|
||||||
|
|||||||
@@ -163,11 +163,11 @@ defmodule SsoBsnWeb.UserAuth do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def on_mount(:redirect_if_user_is_authenticated, _params, session, socket) do
|
def on_mount(:redirect_if_user_is_authenticated, params, session, socket) do
|
||||||
socket = mount_current_user(socket, session)
|
socket = mount_current_user(socket, session)
|
||||||
|
|
||||||
if socket.assigns.current_user do
|
if socket.assigns.current_user do
|
||||||
{:halt, Phoenix.LiveView.redirect(socket, to: signed_in_path(socket))}
|
{:halt, Phoenix.LiveView.redirect(socket, to: signed_in_path(params["next"]))}
|
||||||
else
|
else
|
||||||
{:cont, socket}
|
{:cont, socket}
|
||||||
end
|
end
|
||||||
@@ -224,5 +224,7 @@ defmodule SsoBsnWeb.UserAuth do
|
|||||||
|
|
||||||
defp maybe_store_return_to(conn), do: conn
|
defp maybe_store_return_to(conn), do: conn
|
||||||
|
|
||||||
defp signed_in_path(_conn), do: ~p"/users/settings"
|
defp signed_in_path(%Plug.Conn{ query_params: %{ "next" => next }}), do: ~p"/redirect?next=#{next}"
|
||||||
|
defp signed_in_path(next) when is_binary(next), do: ~p"/redirect?next=#{next}"
|
||||||
|
defp signed_in_path(_), do: ~p"/users/settings"
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user