[解決済み] Railsです。サインイン時に "BCrypt::Errors::InvalidHash" が発生する
質問
私はあるプロジェクトを完成させようとしています。私はユーザーモデルを使用しています。 私はサインアップするとき、すべてがうまく見える。しかし、私は同じメンバーにサインインしようとすると、このエラーが発生します。
申し訳ありませんが、何か問題が発生しました。 herokuログ ファイルには、次のようなエラーが表示されます。
BCrypt::Errors::InvalidHash (invalid hash):
app/controllers/sessions_controller.rb:8:in `create'
私の *sessions_controller* は.
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
sign_out
redirect_to root_path
end
end
そして ユーザーモデル は :
class User < ActiveRecord::Base
attr_accessible :email, :name, :nickname,:password, :password_confirmation
has_secure_password
before_save { |user| user.email = email.downcase }
before_save { |user| user.nickname = nickname.downcase }
before_save :create_remember_token
....validations......
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
これは私の セッション・ヘルパー
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
end
heroku rake db:migrate, heroku restart...を試しましたが、変化がありません。
どうすればいいですか?
これは
password_digest
は有効なBCryptハッシュではありません(フィールドが空の場合も含む)。
コメントから察するに、ユーザーを作成したばかりの時に
has_secure_password
そのため、パスワードのダイジェストは保存されませんでした。データベースを見てください。
password_digest
はそのユーザーのために空です。データベースからそのユーザーを削除し、新しい作業用コードで再作成すれば、うまくいくはずです。
しかし、コメントで議論しているうちに、なぜパスワードが間違っているのかについて(間違って)推測してしまい、すでにその説明を書いてしまったのです。この問題は直接ここには当てはまりませんが、今後この問題に直面する訪問者のために、ここにその説明を書いておきます。
これは、SHA1や他のアルゴリズムからBCryptに切り替えたものの、BCryptでパスワードの再ハッシュ化に失敗した場合に起こるのが一般的です。元のパスワードにアクセスできないので(少なくともアクセスできないはずなので...)、切り替えるには少し醜いです。 両方とも BCryptと元の認証スキーム。例えば、以前はSHA1を使っていて、今はBCryptを使っている場合、SHA1のパスワードハッシュを扱わなければなりません。 として をBCryptの入力用平文パスワードとして使用します。例えば、次のようなBCryptのダイジェストを作成します。
sha1_password = Digest::SHA1.hexdigest("#{salt}#{real_password}")
self.password_digest = BCrypt::Password.create(sha1_password).to_s
次に、bcrypt password_digests を作成するには、以下のように sha1 パスワードハッシュを元にします。 する にアクセスすることができます。
このように認証することになる。
sha1_password = Digest::SHA1.hexdigest("#{salt}#{attempted_password}")
BCrypt::Password.new(self.password_digest) == sha1_password
上記の例ではSHA1を使用しましたが、これは他のハッシュアルゴリズムでも同様に動作します。
関連
-
[解決済み】取得中。「プロジェクトのクローンとマイグレート後に、「マイグレーションは保留中です。この問題を解決するには 'bin/rake db:migrate RAILS_ENV=development' を実行してください。
-
[解決済み] pg gem をインストールしようとすると 'libpq-fe.h' ヘッダが見つからない
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] Rails ExecJS::ProgramError in Pages#home?
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] Heroku: 既存のrailsアプリにseeds.rbをプッシュする方法?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] bcryptはどうして塩を内蔵しているのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜRuby on Railsは、http://localhost:3000 の代わりに http://0.0.0.0:3000 を使用するのですか?
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Railsサーバーがポートはすでに使用されていると言う、そのプロセスを殺すにはどうすればよいですか?
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] Rubyの文字列から日付への変換
-
[解決済み] rake db:migrateを使って1ステップだけロールバックする方法
-
[解決済み] Ruby on Railsでsimple_formを使うさまざまな方法|何が違うの?
-
[解決済み] nil:NilClass の未定義メソッド `each' - しかし、なぜ?
-
[解決済み] railsでcheck_boxをcheckedにする方法は?
-
[解決済み] Railsコンソール:リロード!モデルファイルの変更が反映されない?考えられる理由は何でしょうか?