【发布时间】:2023-03-27 22:23:01
【问题描述】:
所以我最近决定在新的一年学习 Elixir,并且一直在阅读 Phoenix 框架关于如何在 Elixir 中进行 Web 开发的书。
到目前为止,我真的很喜欢它,并且已经开始喜欢这种语言。不过,我在使用 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
这就是代码,一切都在编译,我可以看到它正在正确发送。但由于某种原因,密码永远不会被解析。我用密码“password”创建了另一个用户,甚至做了这样的事情:
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 没有正确比较密码。任何帮助将不胜感激,谢谢!
【问题讨论】:
-
你说“不起作用”是什么意思?你有错误吗?我不是加密专家,但根据我自己的测试,我不相信
"$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M"是一个有效的 bcrypt 字符串。这是复制粘贴错误还是您的数据库中的实际情况? -
Err 那是我粘贴时出错,现在更新了。但是是的,这就是我的数据库中的内容,带有新的更新版本。
-
在书中的某一时刻,他们告诉您将
config :comeonin, bcrypt_log_rounds: 4, pbkdf2_rounds: 1转换为config/test.exs。在您已经将用户和密码插入数据库之后,您是否可以将其放入config/dev.exs甚至config/config.exs?还是有可能您输入了错误的密码?你可以在项目中使用iex -S mix来做hash = Comeonin.Bcrypt.hashpwsalt("password"); Comeonin.Bcrypt.checkpw("password", hash)吗? -
嗯,我明白你在说什么,但这实际上比我在 Elixir 测试部分的位置要早几章。我也做了 iex -S 混合,这很好用。奇怪的是,我正在通过
IO.puts "Given Pass" IO.puts given_pass IO.puts "User password hash" IO.puts user.password_hash检查输入,它看起来是正确的。 -
所以有趣的是,如果我检查
Comeonin.Bcrypt.checkpw("password", "$2b$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M")之类的密码,它确实会损坏,这就是我正在检查的内容。
标签: hash elixir phoenix-framework