2016-03-28 111 views
0

用戶身份驗證下面是我得到的錯誤:鳳凰框架錯誤通過Comeonin

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

它指向此行我的網站/控制器/ 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

請提供調用此函數的函數(可能是控制器)以及提供的參數。很可能這些參數之一是零。 – Gazler

+0

我編輯過的問題包括函數調用和函數本身。 –

+1

user.password_hash是否可能爲零? – Gazler

回答

2

當你提供一個非字符串值,這可能發生,因爲無論是passhash(由出錯信息的指示。)

給你提供了什麼:

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

我們知道通過肯定存在。該行:

user && checkpw(given_pass, user.password_hash) 

會導致錯誤的是password_hash對用戶爲零。你可以通過這樣做來解決這個問題:

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

我明白你在這裏試圖完成什麼,但它似乎並不奏效。 – Sebastialonso