所以我最近决定在新的一年里学习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没有正确地比较密码。非常感谢任何帮助,谢谢!
答案 0 :(得分:2)
我遇到的问题与Elixir或Comeonin库无关!
我的密码只允许Varchar为45,并且它正在截断响应。我将在这里留下这个以防万一有人在将来做一些愚蠢的事情!