Hello community!
I encounter a warning saying that AshAuthentication.Errors.AuthenticationFailed does not implement the AshPhoenix.FormData.Error protocol while running tests (with an voluntary wrong password) for a Phoenix Liveview.
...12:06:14.730 [warning] Unhandled error in form submission for Prepair.AshDomains.Accounts.User.change_password
This error was unhandled because AshAuthentication.Errors.AuthenticationFailed does not implement the `AshPhoenix.FormData.Error` protocol.
** (AshAuthentication.Errors.AuthenticationFailed) Authentication failed
I’ve read this issue: This error was unhandled because it did not implement the `AshPhoenix.FormData.Error` protocol. · Issue #516 · ash-project/ash · GitHub and tried the proposed solution, but it didn’t worked for me.
Here is my change_password action:
update :change_password do
# Use this action to allow users to change their password by providing
# their current password and a new password.
require_atomic? false
accept []
argument :current_password, :string, sensitive?: true, allow_nil?: false
argument :password, :string,
sensitive?: true,
allow_nil?: false
argument :password_confirmation, :string,
sensitive?: true,
allow_nil?: false
validate confirm(:password, :password_confirmation)
validate {AshAuthentication.Strategy.Password.PasswordValidation,
strategy_name: :password, password_argument: :current_password}
change {AshAuthentication.Strategy.Password.HashPasswordChange,
strategy_name: :password}
end
I tried to add change set_context(%{strategy_name: :password}) before the other change call, but it didn’t solved the warning.
Here are the current uses and imports on my resource:
defmodule Prepair.AshDomains.Accounts.User do
use Ash.Resource,
domain: Prepair.AshDomains.Accounts,
data_layer: AshPostgres.DataLayer,
authorizers: [Ash.Policy.Authorizer],
extensions: [AshAuthentication]
alias Prepair.AshDomains.Profiles.Profile
import Prepair.AshDomains.ValidationMacros
Here are the current uses and imports in my domain (which exposes the code interfaces then used in the liveview).
I wonder if I should add AshPhoenix there.
defmodule Prepair.AshDomains.Accounts do
use Ash.Domain
And here is my handle_event function for the save action in the Liveview:
def handle_event("save", %{"user" => params}, socket) do
current_user = socket.assigns.current_user
form =
AshPhoenix.Form.for_update(current_user, :change_password,
domain: Accounts,
as: "user"
)
|> AshPhoenix.Form.validate(params)
case AshPhoenix.Form.submit(form, params: params) do
{:ok, _user} ->
{:noreply,
socket
|> put_flash(:info, "Password updated successfully")
|> redirect(to: ~p"/")}
{:error, form} ->
{:noreply,
socket |> assign(:form, to_form(form)) |> assign(check_errors: true)}
end
end




















