Cách sử dụng has_secure_passoword trong ứng dụng của bạn
- Nó là cái gì và tại sao phải dùng nó?
Khi bạn xây dụng một ứng dụng thì điều vô cùng quan trong đó chính là authenticate người dùng. Bằng cách sử dụng has_secure_password thì công việc ấy trở nên vô cùng dễ dàng. Tuy nhiên bạn đã hiểu rõ hết tất cả các chức năng mà nó mang lại.
Bài viết một phần sẽ giới thiệu những chức năng chính của nó theo góc nhìn của mình. Feel free to leave all the comments bellow
-
Install Cách cài đặt vô cùng quan trong. Bạn chỉ cần thêm has_secure_password vào model của bạn và đừng quên thêm gem brcrypt nhé. Nó sẽ dự vào gem nào để encrypt password.
gem 'bcrypt', '~> 3.1.7'
Sau khi cài đặt gem bcrypt, bạn cần có phải tạo model. Follow documention của nó https://api.rubyonrails.org/v7.1.3.2/classes/ActiveModel/SecurePassword/ClassMethods.html, bạn phải thêm column có định dạng là XXX_digest. Dưới đây là một ví dụ bạn cứ copy và thêm các column mà mình mong muốn. Về column password_digest thì nó quá rõ ràng rồi đúng không dùng để validate password, còn hai column còn lại mình sẽ giải thích sau.
rails g model User email:string password_digest:string recovery_password_digest:string password_challenge:string
- Những chức năng chính?
Chúng ta cùng điểm qua những function mà this bad boy has_secure_passoword bring into your model.
Encrypt password and authenticate password
Xét ví dụ sau đây bạn sẽ hiểu
user = User.new(email: "email@gmail.com", password: "123456", password_confirmation: "")
user.save # false, password confirmation không hợp user.password_confirmation="123456"
user.save # true user.authenticate("invalid_password") # false
user.authenticate("123456") # user
Như bạn thấy đó has_secure_password tạo thêm cho bạn 2 attributes ảo là password và password_confirmation, ngoài ra nó cũng cung cấp thêm phương thức authenticate để giúp bạn validate password user nhập là đúng hay không. Bạn có thể dùng nó để làm chức năng sign_in nhá.
Recovery password
Môt chức năng có thể thấy là ứng dụng nào cũng có đó là forgot password.
user.recovery_password = "42password"
user.recovery_password_digest # => "$2a$04$iOfhwahFymCs5weB3BNH/uXkTG65HR.qpW.bNhEjFP3ftli3o5DQC"
user.save # => true
Đầu tiên user sẽ click forgot password. Lúc này BE chúng ta tự tạo recovery_password, bạn có thể random bất cứ thứ gì tuỳ thuộc vào bạn. Sau đó bạn sẽ gửi email với cái recovery password vừa tạo lúc này. User bất buộc phải nhập recovery code trong mail trên UI và submit xuống BE chúng ta. Lúc đó chúng ta chị cần verify cái recovery code đó.
user.authenticate_recovery_password("42password") # => user
Ok!. Nếu pass authenticate_recovery_password mình chuyển hướng user đến trong udpate password thôi, easy ấy mà
Update password with password challenge Khi đến trang update password thì có những cách update password nào đây. Thông thường mình sẽ update password như thế. này đúng không
user.update!(password: "new_password", password_confirmation: "new_password")
Một câu hỏi đặt ra nữa, bây giờ chúng ta không muốn user không được sử dụng mật khẩu cũ để update hay chúng ta muốn lưu lại mật khẩu cũ để có reset lại account cho user trong trường hợp user đánh cập mật khâu, thì làm sao. Hãy xem một cách tiếp cận mới nhé
user.update(password: "new_password", password_challenge: "old_password")
Lưu ý ở đây password_challenge là password cũ đó nhe. Cách cài đặt đảm bạo bạn muốn chính tay user đó thực hiện đổi mật khẩu hay bạn có thể validate mật khẩu mới không thể trùng với mật khẩu cũ. Một ý nữa trong trường hơp hacker đánh cắp tài khoản của user và tiến hành update mật khẩu mới, bạn có thể lại reset lại mật khẩu cho user nhé. Đồng