私は最近新年のエリクサーを学びたいと思っていましたが、エリクシルのウェブ開発の仕組みに関するフェニックスのフレームワークの本を読んでいます。エリクサーのお小遣いさんはハッシュを正しくチェックしていないようです
これまでのところ、私は本当に楽しんでおり、すでに言語を愛し始めています。私はCome-on-inパッケージでいくつかの問題に出くわしました。
1人はそれをコンパイルしていましたが、これは問題ありません。しかし、私はそれが問題を引き起こしているのだろうかと疑問に思っています。問題は、この問題をどのようにデバッグするかを考え出すのが難しいです。
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が正しくパスワードを比較していません。どんな助けでも大変感謝しています。ありがとう!
"動作しない"とはどういう意味ですか?エラーが発生していますか?私は暗号化の専門家ではありませんが、自分のテストに基づいて、 "$ 12 $ aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M"は有効なbcrypt文字列ではないと思います。それはコピーの貼り付けエラーですか、それとも実際にあなたのデータベースに入っていますか? –
エラーを貼り付けたときにエラーが発生しました。現在は更新されています。しかし、はい、私のデータベースには、新しい更新版があります。 –
本書のある時点で、 'config:comeonin、bcrypt_log_rounds:4、pbkdf2_rounds:1'のようなものを' config/test.exs'に行うように指示します。既にあなたがデータベースにユーザーとパスワードを挿入した後に、 'config/dev.exs'や' config/config.exs'に置くことは可能でしょうか?または、パスワードを誤って入力した可能性はありますか? 'hash = Comeonin.Bcrypt.hashpwsalt(" password ");することができますか?プロジェクト内で 'iex -S mix 'を使ってComeonin.Bcrypt.checkpw(" password "、hash) –