我正在尝试设置一个简单的iOS / Rails应用程序,我可以创建一个用户,然后使用BCrypt对它们进行身份验证。我试图遵循BCrypt的说明,但我的身份验证过程无效。对于rails非常新,所以我确定我搞砸了一些简单的东西!
创建新用户:
在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
在服务器上:
在2014-08-21 19:32:05 -0500开始发布“/users.json”for 192.168.2.6
UsersController处理#create为JSON
参数:{“username”=>“testtest”,“password”=>“[FILTERED]”,“user”=> {“username”=>“testtest”}}
(0.1ms)开始交易
用户存在(20.8ms)SELECT 1 AS一个FROM“users”WHERE“users”。“username”='testtest'LIMIT 1
在string
列上为password_hash
类型插入的二进制数据
SQL(0.8ms)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“],[”updated_at“,”2014-08-22 00:32:05.960378“],[”用户名“,”testtest“ ]]
(1.3ms)提交事务
呈现的用户/ show.json.jbuilder(0.3ms)
完成201创建于136ms(浏览次数:31.9ms | ActiveRecord:23.5ms)
验证用户身份:
在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
服务器:
*在2014-08-21 19:38:26 -0500开始了192.168.2.6的POST“/ session” 由SessionsController处理#create as / 参数:{“username”=>“testtest”,“password”=>“[FILTERED]”,“session”=> {“username”=>“testtest”,“password”=>“[ FILTERED]“}} 用户负载(0.2ms)SELECT“users”。* FROM“users”WHERE“users”。“username”=“testtest”LIMIT 1 渲染会话/ fail.json.jbuilder(0.2ms) 在105ms完成200 OK(浏览次数:23.3ms | ActiveRecord:0.2ms)*
非常感谢任何见解!
答案 0 :(得分: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