Elixir的comeonin似乎没有正确检查哈希

时间:2017-01-15 19:13:15

标签: hash elixir phoenix-framework

所以我最近决定在新的一年里学习Elixir,并且已经阅读了凤凰框架关于网络开发在Elixir中如何运作的书。

到目前为止,我真的非常喜欢它,并且我已经开始喜欢这种语言了。我现在遇到了一些关于Come-on-in软件包的问题。

一个正在编译它,这很好。但我想知道它是否会导致问题,问题是我无法弄清楚如何调试此问题。

defmodule Rumbl.Auth do
  import Plug.Conn

  def init(opts) do
    Keyword.fetch!(opts, :repo)
  end

  def call(conn, repo) do
    user_id = get_session(conn, :user_id)
    user    = user_id && repo.get(Rumbl.User, user_id)
    assign(conn, :current_user, user)
  end

  def login(conn, user) do
    conn
    |> assign(:current_user, user)
    |> put_session(:user_id, user.id)
    |> configure_session(renew: true)
  end

  def logout(conn) do
    configure_session(conn, drop: true)
  end

  import Comeonin.Bcrypt, only: [checkpw: 2, dummy_checkpw: 0]

  def login_by_username_and_pass(conn, username, given_pass, opts) do
    repo = Keyword.fetch!(opts, :repo)
    user = repo.get_by(Rumbl.User, username: username)

    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
end

这是代码,一切都在编译,我可以看到它正确发送。但由于某种原因,密码永远不会得到解决。我用另一个用户输入了密码"密码"甚至做了这样的事情:

checkpw("password", "$2b$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M")

只是为了看看我是如何传递信息的,显然这是我数据库中的哈希,而且也不起作用。我不知道自己做错了什么,或者因为这是我第一次使用Bcrypt并且我不能100%确定如果我正在使用图书馆本身如何运作。

我用以下方法对密码进行哈希处理:

defp put_pass_hash(changeset) do
    case changeset do
      %Ecto.Changeset{valid?: true, changes: %{password: pass}} ->
        put_change(changeset, :password_hash, Comeonin.Bcrypt.hashpwsalt(pass))
      _ ->
        changeset
    end
  end

我已经查看了我能想到的一切,而且看起来都很正确,但由于某些原因,Comeonin没有正确地比较密码。非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

我遇到的问题与Elixir或Comeonin库无关!

我的密码只允许Varchar为45,并且它正在截断响应。我将在这里留下这个以防万一有人在将来做一些愚蠢的事情!