Cookies with Rails

Cookies

Với một cookie, bạn có thể lưu trữ thông tin trên hệ thống của trình duyệt web dưới dạng các chuỗi như cặp key-value mà web server đã gửi trước đó đến trình duyệt này. Thông tin sau đó được gửi lại từ trình duyệt đến máy chủ trong HTTP header. Cookie (nếu được định cấu hình phù hợp) sẽ bị xóa khỏi hệ thống trình duyệt bằng cách khởi động lại trình duyệt cũng như khởi động lại toàn bộ hệ thống. Tất nhiên, người dùng của trình duyệt có thể tự xóa cookie. Rails cung cấp một hash với tên là cookies[]. Để chứng minh làm thế nào cookie hoạt động, chúng ta sẽ xây dựng một ứng dụng Rails đặt một cookie trên một trang, đọc nó trên một trang khác và hiển thị nội dung, và cookie bị xóa trên trang thứ ba.

rails new cookie_jar
cd cookie_jar 
rails generate controller Home set_cookies show_cookies delete_cookies

File controller app/controllers/home_controller.rb như sau:

class HomeController < ApplicationController
  def set_cookies
    cookies[:user_name]   = "Horst Meier" 
    cookies[:customer_number] = "1234567890" 
  end
  
  def show_cookies
    @user_name    = cookies[:user_name]
    @customer_number = cookies[:customer_number]
  end
  
  def delete_cookies
    cookies.delete :user_name
    cookies.delete :customer_number
  end
end

Và file view app/views/home/show_cookies.html.erb như sau:

<table>
 <tr><td>User Name:</td><td><%= @user_name %></td></tr>
 <tr><td>Customer Number:</td><td><%= @customer_number %></td></tr>
</table>

Khởi động Rails server và đi đến url http://0.0.0.0:3000/home/show_cookies trong trình duyệt của bạn. Bạn sẽ không nhìn thấy bất kỳ giá trị nào. Bây giờ hãy đi đến url http://0.0.0.0:3000/home/set_cookies và sau đó quay lại http://0.0.0.0:3000/home/show_cookies. Bạn sẽ thấy các giá trị mà chúng ta đã set trong method set_cookies. Bằng cách try cập trang http://0.0.0.0:3000/home/delete_cookies bạn có thể delete các cookie.

Permanent Cookies

Cookie thường được set để cung cấp cho ứng dụng một cách để nhận dạng người dùng khi họ ghé thăm lại sau. Giữa những lần truy cập vào trang web này, có thể kéo dài nhiều thời gian và người dùng cũng có thể đóng trình duyệt trong thời gian chờ đợi. Để lưu trữ các cookie lâu hơn phiên trình duyệt hiện tại, bạn có thể sử dụng phương thức permanent. Thêm phương thức này vào trong app/controllers/home_controller.rb:

class HomeController < ApplicationController
  def set_cookies
    cookies.permanent[:user_name]   = "Horst Meier" 
    cookies.permanent[:customer_number] = "1234567890" 
  end
  
  def show_cookies
    @user_name    = cookies[:user_name]
    @customer_number = cookies[:customer_number]
  end
  
  def delete_cookies
    cookies.delete :user_name
    cookies.delete :customer_number
  end
  
  def debug_cookies
  end
end

Signed Cookies

Với cookie thông thường được đặt, bạn không có tùy chọn ở phía ứng dụng để tìm hiểu xem người dùng ứng dụng đã thay đổi cookie. Điều này có thể nhanh chóng dẫn đến các vấn đề bảo mật, vì việc thay đổi nội dung của một cookie trong trình duyệt không phải là khó. Giải pháp là đăng ký các cookie với một key chỉ được biết với chúng ta. Key này được tạo tự động thông qua một máy phát ngẫu nhiên với mỗi rails new và nằm trong file config/initializers/secret_token.rb:

# Be sure to restart your server when you modify this file.

# Your secret key for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
CookieJar::Application.config.secret_token = '85ec33910d4d57f3d3c69cb8fef20f158f68a219a76db71280779454a523330874fc4e42c7e62ecb25b8e4f5fcce1dcad88c7dcc9671a9922f675d770270a25a'

Sử dụng phương thức signed. Bạn phải sử dụng nó để viết và đọc cookie. Thêm phương thức này vào trong app/controllers/home_controller.rb:

class HomeController < ApplicationController
  def set_cookies
    cookies.permanent.signed[:user_name]   = "Horst Meier" 
    cookies.permanent.signed[:customer_number] = "1234567890" 
  end

  def show_cookies
    @user_name    = cookies.signed[:user_name]
    @customer_number = cookies.signed[:customer_number]
  end

  def delete_cookies
    cookies.delete :user_name
    cookies.delete :customer_number
  end

  def debug_cookies
  end
end

Nội dung của cookie được lưu ở dạng mã hoá mỗi lần bạn thiết lập cookie. Tên của cookie vẫn có thể được người dùng đọc, nhưng không phải là giá trị.

Tham khảo

http://www.xyzpub.com/en/ruby-on-rails/3.2/cookies.html#cookies_permanent