Saya sedang mengerjakan aplikasi Rails 4 baru (di Ruby 2.0.0-p0) ketika saya mengalami beberapa masalah token keaslian.
Sambil menulis pengontrol yang merespons json (menggunakan respond_to
metode kelas), saya mendapatkan create
tindakan yang mulai mendapatkan ActionController::InvalidAuthenticityToken
pengecualian ketika saya mencoba membuat catatan menggunakan curl
.
Saya memastikan saya mengatur -H "Content-Type: application/json"
dan saya mengatur data dengan -d "<my data here>"
tetapi masih tidak berhasil.
Saya mencoba menulis controller yang sama menggunakan Rails 3.2 (pada Ruby 1.9.3) dan saya tidak mendapatkan masalah token apapun. Saya mencari-cari dan melihat ada beberapa perubahan dengan token keaslian di Rails 4. Dari apa yang saya mengerti, mereka tidak lagi secara otomatis dimasukkan ke dalam formulir lagi? Saya kira ini entah bagaimana mempengaruhi tipe konten non-HTML.
Apakah ada cara untuk mengatasi ini tanpa harus meminta formulir HTML, menyambar token keaslian, lalu membuat permintaan lain dengan token itu? Atau apakah saya benar-benar kehilangan sesuatu yang sangat jelas?
Sunting: Saya baru saja mencoba membuat catatan baru di aplikasi Rails 4 baru menggunakan perancah tanpa mengubah apa pun dan saya mengalami masalah yang sama jadi saya kira itu bukan sesuatu yang saya lakukan.
before_action
yang memeriksa format dan apakah permintaan diverifikasi. Saya tidak tahu ada cara dibangun untuk mengatur kondisi.skip_before_action :verify_authenticity_token
pada pengontrol aplikasi API saya juga untuk membuat ini berfungsi.:verify_authenticy_token
lagi di Rails 4.2. Defaultnya adalah:null_session
, yang, seperti namanya, hanya memberi Anda permintaan tanpa sesi. Anda bisa memverifikasi permintaan melalui kunci API.Daripada mematikan perlindungan csrf, lebih baik menambahkan baris kode berikut ke dalam formulir
dan jika Anda menggunakan form_for atau form_tag untuk menghasilkan formulir, maka secara otomatis akan menambahkan baris kode di atas dalam formulir
sumber
Menambahkan baris berikut ke dalam form berfungsi untuk saya:
sumber
=token_tag nil
atau (dalam .erb)<%= token_tag nil %>
Saya tidak berpikir itu baik untuk secara umum mematikan perlindungan CSRF selama Anda tidak secara eksklusif menerapkan API.
Ketika melihat dokumentasi Rails 4 API untuk ActionController saya menemukan bahwa Anda dapat mematikan perlindungan pemalsuan pada per controller atau per basis metode.
Misalnya untuk mematikan perlindungan CSRF untuk metode yang dapat Anda gunakan
sumber
Datang di masalah yang sama. Memperbaikinya dengan menambahkan ke controller saya:
sumber
Apakah kamu sudah mencoba?
sumber
Dokumen resmi ini - berbicara tentang cara mematikan perlindungan pemalsuan untuk api dengan benar http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
sumber
Ini adalah fitur keamanan di Rails. Tambahkan baris kode ini dalam formulir:
Dokumentasi dapat ditemukan di sini: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
sumber
Fitur-fitur ini ditambahkan untuk tujuan perlindungan keamanan dan pemalsuan.
Namun, untuk menjawab pertanyaan Anda, berikut adalah beberapa masukan. Anda dapat menambahkan baris ini setelah nama pengontrol Anda.
Seperti itu,
Berikut adalah beberapa jalur untuk versi rel yang berbeda.
Rel 3
Rel 4 :
Jika Anda bermaksud untuk menonaktifkan fitur keamanan ini untuk semua rutinitas pengontrol, Anda dapat mengubah nilai protect_from_forgery menjadi : null_session pada file application_controller.rb Anda.
Seperti itu,
sumber
Jika Anda menggunakan jQuery with rails, berhati-hatilah mengizinkan masuk ke metode tanpa memverifikasi token keaslian.
jquery-ujs dapat mengelola token untuk Anda
Anda seharusnya sudah memilikinya sebagai bagian dari permata jquery-rails, tetapi Anda mungkin harus memasukkannya ke dalam application.js dengan
Itu saja yang Anda butuhkan - panggilan ajax Anda sekarang harus berfungsi
Untuk informasi lebih lanjut, lihat: https://github.com/rails/jquery-ujs
sumber
Tambahkan
authenticity_token: true
ke tag formulirsumber
Ketika Anda menentukan Anda memiliki bentuk html maka Anda harus memasukkan string token otentikasi, yang harus dikirim ke controller untuk alasan keamanan. Jika Anda menggunakan helper form helper untuk menghasilkan token keaslian ditambahkan ke form sebagai berikut.
Jadi solusi untuk masalah ini adalah dengan menambahkan bidang authenticity_token atau menggunakan rel bentuk helpers daripada mengorbankan keamanan dll.
sumber
application/json
.Semua tes saya bekerja dengan baik. Tetapi untuk beberapa alasan saya telah menetapkan variabel lingkungan saya ke non-tes:
Saya lupa menghapus variabel ini karena saya mulai mendapatkan
ActionController::InvalidAuthenticityToken
pengecualian.Setelah tidak disetel
$RAILS_ENV
, tes saya mulai bekerja lagi.sumber