This project made based on Progate
Intro
Now we are going to secure our web
- hash password
- session token
Install Gem
When encrypting passwords with Rails, something known as a gem is required. A gem is a third-party library you can use with Ruby. There are various gems such as “the search functionality gem”, or “the encrypt passwords gems”. This time we’ll use bcrypt, which is a gem to encrypt password.
In Rails, there’s a file named Gemfile where you write the gems you want to install, like gem 'gem_name'. Some gems are already written when you run the rails new command. When you install gems, the Gemfile.lock file is automatically updated.
You can specify the version of the gem, like gem 'rails', '5.0.3'. If you don’t specify
This time, we’ll add a gem known as bcrypt. You can do this by adding gem 'bcrypt’ to the Gemfile, and run the command bundle install in the terminal.
After installing bcrypt, we can use a method known as has_secure_password. By adding it to the User model, Rails will automatically encrypt the password when saving the user..
Add password_digest column
The password is stored in the password_digest column for safety, not in password column, after being encrypted by has_secure_password method. Then, we need to add password_digest column and remove the existing password column from database.
Let’s create a migration file rails g migration change_users_columns. After creating a file, as We can change multiple columns in one migration file,
edit the migration file so that the password_digest column is added and also remove the password column.
|
|
Then run rails db:migrate
Using Encrypted Password
Create
To save the encrypted password in the password_digest column, we can assign the value to password as we’ve done before. The value assigned to password will be encrypted by has_secure_password, then stored in the password_digest column. Therefore, there’s no need to change the existing code for the password.
In rails console rails c, try to get a user like user = User.first and assign a password on it user.password = yourcustompass. Then check on our database, the password_digest column should be filed.
Login
With the has_secure_password method, you can use the authenticate method. This method encrypts the received argument and compares it with the value of password_digest. We can use this to judge whether the password sent from matches the password_digest. In the user_controller.rb we modify login method, so then
|
|