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.