2017-01-15 8 views
1

私は最近新年のエリクサーを学びたいと思っていましたが、エリクシルのウェブ開発の仕組みに関するフェニックスのフレームワークの本を読んでいます。エリクサーのお小遣いさんはハッシュを正しくチェックしていないようです

これまでのところ、私は本当に楽しんでおり、すでに言語を愛し始めています。私は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が正しくパスワードを比較していません。どんな助けでも大変感謝しています。ありがとう!

+0

"動作しない"とはどういう意味ですか?エラーが発生していますか?私は暗号化の専門家ではありませんが、自分のテストに基づいて、 "$ 12 $ aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M"は有効なbcrypt文字列ではないと思います。それはコピーの貼り付けエラーですか、それとも実際にあなたのデータベースに入っていますか? –

+0

エラーを貼り付けたときにエラーが発生しました。現在は更新されています。しかし、はい、私のデータベースには、新しい更新版があります。 –

+0

本書のある時点で、 '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) –

答えて

2

私が抱えていた問題は、エリクシルやカムモニンのライブラリとは関係ありませんでした!

自分のパスワードにはVarchar 45しか許可されておらず、応答が切り捨てられていました。私はこれをここに残すつもりだ、誰かがこれほど愚かな何かを将来的にするならば!

関連する問題