[RUBY-ON-RAILS] "BCrypt :: 오류 :: InvalidHash"로그인 시도
RUBY-ON-RAILS"BCrypt :: 오류 :: 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
이 내 session.helper입니다
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가 다시 시작, 마이그레이션 변화가 없다 : 나는 Heroku가이 DB를 긁어했습니다.
해결법
-
==============================
1.password_digest에 저장된 해시 (필드가 비어있는 경우 포함) 유효한 BCrypt 해시 아니라고이 의미합니다.
password_digest에 저장된 해시 (필드가 비어있는 경우 포함) 유효한 BCrypt 해시 아니라고이 의미합니다.
암호가 저장되지있어 결코 소화 있도록 단지의 has_secure_password이 아니 었 한 번에 사용자가 만든 같은 의견을 바탕으로, 그것은 보인다. 데이터베이스에서 봐, 당신은 아마 그 password_digest가 해당 사용자의 비어 볼 수 있습니다. 데이터베이스에서 사용자를 제거하고 새로운 작업 코드를 다시 작성하고 그것을 작동합니다.
비록 의견과 논의하는 동안, 나는 암호가 잘못된 이유에 대한 (잘못된) 추측을했고, 난 이미 설명을 썼다. 그래서 여기 그것이 바로 여기에 적용되지 않는 경우에도이 문제를 가지고 미래의 방문자를위한 것입니다
당신은 SHA1 또는 BCrypt 또 다른 알고리즘을 사용하여 전환하지만 다시 해시 BCrypt의 암호를 실패 할 때 일반적으로 발생합니다. 원래 암호에 액세스 할 수 없기 때문에 당신이 BCrypt 원래의 인증 방식을 모두 사용하기 때문에 (또는 당신이 ... 안 적어도)는 스위치에 조금 추한. 예를 들어, 당신이 전에 SHA1을 사용하여 현재 BCrypt를 사용한다면, 당신은 BCrypt 입력을위한 일반 텍스트 암호로 SHA1 암호 해시를 치료해야합니다. 예를 들어,이 같은 BCrypt 다이제스트를 생성 할 수 있습니다 :
sha1_password = Digest::SHA1.hexdigest("#{salt}#{real_password}") self.password_digest = BCrypt::Password.create(sha1_password).to_s
그런 다음, 당신은에 액세스 할 수있는 SHA1 암호 해시를 기반 bcrypt password_digests을 만들 수 있습니다.
이 같은 인증 것이다 :
sha1_password = Digest::SHA1.hexdigest("#{salt}#{attempted_password}") BCrypt::Password.new(self.password_digest) == sha1_password
나는 위의 예에서 SHA1을 사용하지만, 이것은 다른 해싱 알고리즘을 위해 일뿐만 아니라 것입니다.
-
==============================
2.이미 라이브 사용자가 있고, 마찬가지로 이미 데이터베이스에 암호화되지 않은 암호를 저장. 내가 bcrypt를 사용하기 시작 후에는 암호화 된 암호를 기다리고 있었다, 그리고 그것을 찾지 못한 경우,이 오류를 생산했다.
이미 라이브 사용자가 있고, 마찬가지로 이미 데이터베이스에 암호화되지 않은 암호를 저장. 내가 bcrypt를 사용하기 시작 후에는 암호화 된 암호를 기다리고 있었다, 그리고 그것을 찾지 못한 경우,이 오류를 생산했다.
따라서, 나는 자신의 암호를 재설정 오류를 잡아 레거시 메시지를 표시하기 위해이 구조를 추가 :
begin # your code that attempts to login the user rescue BCrypt::Errors::InvalidHash flash[:error] = 'We recently adjusted the way our passwords are stored. Please click the "forgot username or password?" link to re-establish your password. Thank you for your understanding!' redirect_to password_resets_url end
도움이 되었기를 바랍니다.
from https://stackoverflow.com/questions/11037864/bcrypterrorsinvalidhash-when-trying-to-sign-in by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 작동하지 않는 4.0 expire_fragment / 캐시 만료 레일 (0) | 2020.03.02 |
---|---|
[RUBY-ON-RAILS] 레일에서 어떻게 핸들 배수 단지에 분할 체크 박스를 체크, 또는? (0) | 2020.03.02 |
[RUBY-ON-RAILS] 레일 : named_scope, 람다 및 블록 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 어떻게 루비 레일에 전체 텍스트 검색합니까? (0) | 2020.03.02 |
[RUBY-ON-RAILS] API 인증은 사용자의 웹 응용 프로그램 서버에 로그인 (0) | 2020.03.02 |