You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The installer creates an AuthController that will redirect the user based on :return_to in the session but doesn't supply a means to capture and set the :return_to value.
Create a plug something like the following and include it on install or create an igniter task to create it. The example code will look for certain paths like /sign-in with the specified query parameter and store the value in the session.
defmoduleYourAppWeb.Plugs.ReturnToPlugdo@moduledoc""" Plug to capture the return_to query parameter and store it in the session. This allows for proper redirection after successful authentication while preventing redirect loops to authentication-related pages. ## Options * `:paths` - A list of paths where the plug should capture the return_to parameter default: ["/sign-in"] * `:param_name` - The name of the query parameter to capture default: "return_to" * `:session_key` - The session key where the return path will be stored default: :return_to * `:blocked_redirect_paths` - A list of paths that should be blocked as return destinations. This is a starts_with? comparison. default: ["/auth", "/password-reset", "/reset", "/register", "/sign-in", "/sign-out"] ## Examples Using default options: # In your router.ex pipeline :browser do # ...other plugs plug YourAppWeb.Plugs.ReturnToPlug end With custom paths: # Capture return_to on multiple paths plug YourAppWeb.Plugs.ReturnToPlug, paths: ["/sign-in", "/login", "/register"] Fully customized configuration: # Custom parameter name, session key, and blocked paths plug YourAppWeb.Plugs.ReturnToPlug, paths: ["/sign-in", "/login"], param_name: "redirect_to", session_key: :redirect_after_login, blocked_redirect_paths: ["/auth", "/password-reset", "/reset", "/register", "/sign-in", "/sign-out"] """importPlug.Conn@default_options[paths: ["/sign-in"],param_name: "return_to",session_key: :return_to,blocked_redirect_paths: ["/auth","/password-reset","/reset","/register","/sign-in","/sign-out"]]definit(opts)doKeyword.merge(@default_options,opts)enddefcall(conn,opts)doconn=fetch_query_params(conn)# Check if current path is in the configured pathsifmatching_path?(conn,opts[:paths])&&has_return_to_param?(conn,opts[:param_name])do# Extract the return_to parameterreturn_to=get_return_to_param(conn,opts[:param_name])# Only store it if it's not pointing to a blocked pathifblocked_return_path?(return_to,opts[:blocked_redirect_paths])do# If blocked, we could either keep the conn unchanged or clear any existing return_to# Here we choose to clear it to be extra safedelete_session(conn,opts[:session_key])elseput_session(conn,opts[:session_key],return_to)endelseconnendend# Checks if the current path matches any of the configured pathsdefpmatching_path?(conn,paths)doEnum.member?(paths,conn.request_path)end# Checks if the request has the configured query parameterdefphas_return_to_param?(conn,param_name)doconn.query_params[param_name]!=nilend# Gets the configured parameter value from the query parametersdefpget_return_to_param(conn,param_name)doconn.query_params[param_name]end# Checks if the return path starts with any of the blocked prefixesdefpblocked_return_path?(return_path,blocked_redirect_paths)dopath_to_check=URI.parse(return_path).pathEnum.any?(blocked_redirect_paths,fnprefix->String.starts_with?(path_to_check,prefix)end)endend
The text was updated successfully, but these errors were encountered:
I think it's a great idea. Let's hear from @jimsynz if he is into it, and if so PRs welcome! This should be a relatively straight forward change to the ash_authentication_phoenix installer to create this module into user's applications.
The installer creates an AuthController that will redirect the user based on :return_to in the session but doesn't supply a means to capture and set the :return_to value.
Create a plug something like the following and include it on install or create an igniter task to create it. The example code will look for certain paths like /sign-in with the specified query parameter and store the value in the session.
The text was updated successfully, but these errors were encountered: