【问题标题】:Cannot get BCrypt autentication to work无法使 BCrypt 身份验证工作
【发布时间】:2014-08-22 00:41:40
【问题描述】:

我正在尝试设置一个简单的 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 开始为 192.168.2.6 发布 POST "/users.json" 由 UsersController#create 作为 JSON 处理 参数:{"username"=>"testtest", "password"=>"[FILTERED]", "user"=>{"username"=>"testtest"}} (0.1ms) 开始交易 用户存在 (20.8ms) SELECT 1 AS one FROM "users" WHERE "users"."username" = 'testtest' LIMIT 1 在列password_hash 上为string 类型插入二进制数据 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"], ["用户名" ]] (1.3ms) 提交事务 渲染用户/show.json.jbuilder (0.3ms) 完成 201 创建于 136 毫秒(查看:31.9 毫秒 | ActiveRecord:23.5 毫秒)

认证用户:

在 session_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) 在 105 毫秒内完成 200 次 OK(查看次数:23.3 毫秒 | ActiveRecord:0.2 毫秒)*

非常感谢您的任何见解!

【问题讨论】:

    标签: ruby-on-rails basic-authentication bcrypt bcrypt-ruby


    【解决方案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 
    

    【讨论】:

    • 谢谢!我的代码还有一些其他问题,但这对我有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多