Problem logging in without user - "expected at least one result but got none in query"

I currently have an error in my driver.
My application works normally …
Logs in with a registered user
Exit and everything …
The problem is…
Whenever I try to login without user, it returns me an error.
"expected at least one result but got none in query:"
Could someone help me to improve it?
Below is my controller

  def create(conn, params) do
    user = Account.get_user_by_email! params["email"]
    valid = Comeonin.Argon2.checkpw(params["password"], user.password_hash)

    if valid do
      conn
      |> Sedpool.Guardian.Plug.sign_in(user)
      |> put_flash(:info, "Login efetuado!")
      |> redirect(to: "/")
    else
      render conn, "index.html"
    end
  end

That cannot be recommended…

user = Account.get_user_by_email! params["email"]

Because You cannot be sure it will succeed.

It would be better to hide authentication detail from your controller. Something like this.

    with {:ok, user} <- Accounting.authenticate(params) do
      ...
    end

# and 

  def authenticate(%{"name" => name, "password" => password}) do
    user = get_user_by_name(name)
    case check_password(user, password) do
      true -> {:ok, user}
      _ -> {:error, "Invalid username/password combination."}
    end
  end
  def authenticate(_), do: {:error, "Invalid username/password combination."}
  
  defp check_password(user, password) do
    case user do
      nil -> Comeonin.Bcrypt.dummy_checkpw()
      _ -> Comeonin.Bcrypt.checkpw(password, user.password_hash)
    end
  end

Replace name by email, Bcrypt by Argon2 for your example…

4 Likes

Thank you very much,
everything worked perfectly.