通过Comeonin进行用户身份验证的Phoenix Framework错误

时间:2016-03-28 13:25:58

标签: elixir phoenix-framework

这是我得到的错误:

Wrong type. The password and hash need to be strings.

它指向我的web / controllers / auth.ex文件中的这一行:

user && checkpw(given_pass, user.password_hash) ->

这是此函数中的一行:

  def login_by_email_and_pass(conn, email, given_pass, opts) do
    repo = Keyword.fetch!(opts, :repo)
    user = repo.get_by(Qlc.User, email: email)

    cond do
      user && checkpw(given_pass, user.password_hash) ->
        {:ok, login(conn, user)}
      user ->
        {:error, :unauthorized, conn}
      true ->
        dummy_checkpw()
        {:error, :not_found, conn}
    end
  end

从SessionController模块的create action:

调用此函数
  def create(conn, %{"session" => %{"email" => email, "password" => pass}}) do
    case Qlc.Auth.login_by_email_and_pass(conn, email, pass, repo: Repo) do
      {:ok, conn} ->
        conn
        |> put_flash(:info, "Welcome back!")
        |> redirect(to: page_path(conn, :index))
      {:error, _reason, conn} ->
        conn
        |> put_flash(:error, "Invalid email/password combination")
        |> render("new.html")
    end
  end 

如何解决此错误?我不确定为什么密码和哈希不是字符串和/或我如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

当您将非字符串值提供为passhash时(如错误消息所示),可能会发生这种情况。

鉴于您提供的内容:

def create(conn, %{"session" => %{"email" => email, "password" => pass}}) do

我们知道传球肯定存在。这一行:

user && checkpw(given_pass, user.password_hash)

对于用户,password_hash会导致错误{n}为零。您可以通过执行以下操作来解决此问题:

user && checkpw(given_pass, Map.get(user, :password_hash, ""))`