Tôi đang cố gắng để có được bộ nhớ đệm trang đầy đủ trong Rails nhưng tôi đã đánh một lớn của một snag liên quan đến CSRF - hoặc có lẽ chỉ là sự hiểu biết của tôi về nó. Tôi hiện đang có chuỗi form_authenticity_token
được lưu trữ trong cookie mà JS có thể truy cập và viết lại các thẻ tiêu đề.Mã thông báo xác thực Rails 4 - cả đầu vào và đầu vào bị ẩn biểu mẫu?
Có hai nơi tôi tìm thẻ trong HTML được tạo của tôi:
1) Trong đầu
<meta name="csrf-token" content="[hash]">
2) Bên trong yếu tố đầu vào ẩn của một hình thức
<input type="hidden" name="authenticity_token" value="[different hash]">
Như đã chỉ ra, các băm này khác nhau (ở chế độ phát triển nơi bộ nhớ đệm không phải là enabl ed). Tại sao chúng khác nhau? Tại sao tôi có thể xóa các thẻ meta đầu và để nguyên dạng đầu vào một mình và yêu cầu được cho phép? Tuy nhiên, khi tôi xóa thẻ đầu vào biểu mẫu và để lại tiêu đề, yêu cầu bị từ chối?
Có hiệu quả điều này có nghĩa là thẻ đầu là vô dụng, phải không? Tôi có thể viết lại thẻ đầu vào biểu mẫu cho giá trị trong cookie của mình giống như tôi đã làm với thẻ tiêu đề, nhưng vì chúng khác nhau, tôi thận trọng với kết quả cuối cùng có ý nghĩa gì khi nói đến bộ nhớ đệm toàn bộ trang .
ứng dụng điều khiển bao gồm:
protect_from_forgery with: :exception
before_filter :csrf_cookie
def csrf_cookie
cookies['authenticity-token'.freeze] = {
value: form_authenticity_token,
expires: 1.day.from_now,
secure: (Rails.env.staging? || Rails.env.production?)
}
end