I have used Pow for user authentication and successfully created login & logout feature using custom controller (https://hexdocs.pm/pow/custom_controllers.html ) Now I want to create Forgot Password feature. Pow provides reset password extension “PowResetPassword”. I have install Pow extension by reading the documentation (https://hexdocs.pm/pow/pow_reset_password.html)
I have created a new controller for reset password “WEB_PATH/controllers/reset_password/reset_password_controller.ex”
The controller code is shown below.
def new(conn, _params) do
changeset = Pow.Plug.change_user(conn)
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{“user” => user_params}) do
conn
|> PowResetPassword.Plug.create_reset_token(user_params)
|> case do
{:ok, conn} ->
conn
|> put_flash(:info, 'Check your email to reset password')
|> redirect(to: Routes.reset_password_path(conn, :new))
{:error, conn} ->
conn
|> put_flash(:info, "Error resetting")
|> redirect(to: Routes.reset_password_path(conn, :new))
end
end
def update(conn, %{“user” => user_params}) do
PowResetPassword.Plug.update_user_password(conn, user_params)
# {:ok, conn} = Pow.Plug.clear_authenticated_user(conn)
redirect(conn, to: Routes.login_path(conn, :new))
end
My reset password view is:
<%= form_for @changeset, Routes.reset_password_path(@conn, :create), [class: “form-wrap login-form w-100”], fn f -> %>
Reset password
<% end %>
My routes are
signup_path GET / MyAppWeb.RegistrationController :new
signup_path POST / MyAppWeb.RegistrationController :create
login_path GET /login MyAppWeb.SessionController :new
login_path POST /login MyAppWeb.SessionController :create
reset_password_path GET /reset-password/new MyAppWeb.ResetPasswordController :new
reset_password_path POST /reset-password MyAppWeb.ResetPasswordController :create
reset_password_path PATCH /reset-password/:id MyAppWeb.ResetPasswordController :update
PUT /reset-password/:id MyAppWeb.ResetPasswordController :update
reset_password_path GET /reset-password/:id MyAppWeb.ResetPasswordController :edit
logout_path DELETE /logout MyAppWeb.SessionController :delete
game_path GET /game MyAppWeb.PageController :index
websocket WS /socket/websocket MyAppWeb.UserSocket
When I hit submit ‘continue’ button in reset password page with or without entring any email I am getting error as shown below:
CaseClauseError at POST /reset-password
no case clause matching: {:error, #Ecto.Changeset<action: :update, changes: %{}, errors: [password_hash: {“can’t be blank”, [validation: :required]}, password: {“can’t be blank”, [validation: :required]}], data: #MyApp.Users.User<>, valid?: false>, %Plug
I have taken reference from the Pow module PowResetPassword.Phoenix.ResetPasswordController present in my project “deps” folder but not sure which one to use in “create” , “edit” and “update”. please suggest how can I over come this issue.