Не удается заставить работать аутентификацию BCrypt

Я пытаюсь создать простое приложение iOS / Rails, в котором я могу создать пользователя и впоследствии аутентифицировать его с помощью BCrypt. Я пытался следовать инструкциям BCrypt, но мой процесс аутентификации не работает. Очень новичок в рельсах, поэтому я уверен, что напортачил с чем-то простым!

Чтобы создать нового пользователя:

В users_controller.rb

# POST /users
# POST /users.json
def create
  @user = User.new(user_params)
  @user.password = user_params[:password]

 respond_to do |format|
  if @user.save
    format.html { redirect_to @user, notice: 'User was successfully created.' }
    format.json { render :show, status: :created, location: @user }
  else
    format.html { render :new }
    format.json { render json: @user.errors, status: :unprocessable_entity }
  end
 end
end

def user_params
    params.require(:user).permit(:username, :password)
end

В user.rb

def password
   @password ||= Password.new(password_hash)
end

def password=(new_password)
   @password = Password.create(new_password)
   self.password_hash = @password
end

На сервере:

Запущен POST "/users.json" для 192.168.2.6 в 2014-08-21 19:32:05 -0500 Обработка UsersController # create as JSON Параметры: {"username" => "testtest", "password" => "[FILTERED]", "user" => {"username" => "testtest"}} (0,1 мс) начало транзакции Пользователь существует (20,8 мс) ВЫБРАТЬ 1 КАК ОТ "users" WHERE "users". " username "= 'testtest' LIMIT 1 Двоичные данные, вставленные для типа string в столбце password_hash SQL (0,8 мс) INSERT INTO" users "(" created_at "," password_hash "," updated_at "," username ") VALUES (?,?, ?,?) [["created_at", "2014-08-22 00: 32: 05.960378"], ["password_hash", "$ 2a $ 10 $ UzLdD7ytQXKRDU5MhAawJuFQ3R4oQlPyXh / V4GehNP692fsSpK6wK_at," 2014-08-29, "обновлено"] 22 00: 32: 05.960378 "], [" username "," testtest "]] (1,3 мс) транзакция фиксации Обработано users / show.json.jbuilder (0,3 мс) Завершено 201 Создано за 136 мс (Просмотры: 31,9 мс | ActiveRecord: 23,5 мс)

Аутентификация пользователя:

В sessions_controller.rb

def create
    if @user = User.authenticate(params[:username], params[:password])
        session[:user_id] = @user.id
        render :show
    else
        flash.now[:alert] = "Invalid login/password combination"
        render :action => 'fail'
    end
end

В user.rb

def self.authenticate(username,password)
 @user = User.find_by_username(username)
 return @user.password == password
end

Сервер:

* Запущен POST "/ session" для 192.168.2.6 в 2014-08-21 19:38:26 -0500 Обработка SessionsController # create as / Параметры: {"username" => "testtest", "password" => "[FILTERED]", "session" => {"username" => "testtest", "password" => "[FILTERED]"}} Загрузка пользователя (0,2 мс) SELECT "users". * ОТ "users" ГДЕ "users". "Username" = 'testtest' LIMIT 1 Обработанные сеансы / fail.json.jbuilder (0,2 мс) Завершено 200 OK за 105 мс (Просмотры: 23,3 мс | ActiveRecord: 0,2 мс) *

Большое спасибо за понимание!


person Benny B    schedule 22.08.2014    source источник


Ответы (1)


В основном Bcrypt используется для шифрования пароля.

Вы можете использовать этот следующий метод в модели user.rb для шифрования пароля и аутентификации пользователя.

before_save :encrypt_password
def self.authenticate(name, password)
  user = find_by_user_name(name)
  if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
    user
  else
    nil
  end
end

def encrypt_password
  if password.present?
    self.password_salt = BCrypt::Engine.generate_salt
    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
  end
end 
person Sagar.Patil    schedule 22.08.2014
comment
Спасибо! У меня было еще несколько проблем с моим кодом, но это мне очень помогло. - person Benny B; 25.08.2014