2016-09-05 18 views
10

Ajax aracılığıyla sorulara cevap gönderebileceğim bir Rails uygulamasına sahibim, ancak iyi çalışıyor, ancak, cevabımda görüntüleri yüklemek için aws-js-sdk komut dosyasını ekledim tarayıcıdan, görüntü yeni yüklenen görüntünün url'sini bir geri aramada geri gönderen s3'e yüklenir, sonra cevabı kaydederim. İstek başlığı, AWS JS SDK kullanıldığında HTTP_X_CSRF_TOKEN içermiyor

böyle kütüphaneyi dahil:

<%= javascript_include_tag "//sdk.amazonaws.com/js/aws-sdk-2.1.12.min.js" %> 

Beklenen davranış: Ben bir görüntü ile bir cevap verdiğinde, istek başlık formu web siteme içinden gönderilirse doğrulamak için HTTP_X_CSRF_TOKEN içermelidir.

sorun: istek başlık özgünlük belirteci başlığında ayarlanmamış hata ActionController::InvalidAuthenticityToken

+0

ben '= hidden_field_tag ​​ekleyebilir biliyoruz: authenticity_token , özgünlük belirtecini eklemek için form_authenticity_token ', ancak neden otomatik olarak eklenmediğini bilmek istiyorum. –

+0

S3 yüklemesi başarılı mı? S3 yüklemesi başarılı olduktan sonra, yüklenen resim hakkında hangi bilgileri formla birlikte gönderiyorsunuz? Kodunuzun hiçbirini göstermiyorsunuz, bu yüzden neyin yanlış olduğunu tahmin etmeliyiz, ancak görüntüyü yüklemek için AWS SDK'yı kullanıyor ve ardından Rails uygulamanıza standart bir form gönderme yapıyorsunuz. AWS SDK, Rails uygulamasına gönderim formunda yer almıyor. Bu nedenle, neden bu gönderilere otomatik olarak üstbilgileri eklemesini beklediğinizden emin değilim. –

+0

@MarkB evet S3 yüklemesi başarılı oluyor, yanıtın içerisine dahil ettiğim s3 kabındaki resim URL'sini döndürüyor, sonra formu Rails uygulamasına gönderiyor. Bu yüzden AWS SDK'nın form gönderimine müdahale etmemesini bekliyorum, ancak bunun bir nedeni var. bu mantıklı mı? –

cevap

0

yol açmaktadır HTTP_X_CSRF_TOKEN içermez. Böyle, form etiketine gizli alan olarak ayarlanır:

<form class="edit_user" id="edit_user_6" action="https://stackoverflow.com/users/6/set_facilitator" accept-charset="UTF-8" data-remote="true" method="post"> 
    <input name="utf8" type="hidden" value="✓"> 
    <input type="hidden" name="_method" value="patch"> 
    <input type="hidden" name="authenticity_token" value="yrr7gWaLmE8ul4s0JcNmAU6H0YB+c7YR/8yCE7it+cRlG9lfdejTSFT7bhydWEQPSqv2E7gVPQ++9mvfJDfJeA=="> 
    <select class="form-control" data-submit="true" name="user[facilitator_id]" id="user_facilitator_id"> 

AJAX aracılığıyla formu göndermek

, authenticity_token parametre olarak da sunulur.

Parameters: {"utf8"=>"√", "authenticity_token"=>"vcvY+cRQC0oM99l5+BFHu6GShPAedugTP1jRqXCxRa3bVGFLjLSVbMFk78aR5N0ol1WOu1noAo/GF6B67PSk6Q==", ...} 

Ben S3 mücevher nasıl çalıştığını bilmiyorum, ama Amazon doğrudan gönderirse, o zaman orijinallik belirteçleri kullanmaz. Amazon, sunucunuzdaki raylar uygulamanızın gizli anahtarını bilmenin bir yolu yoktur. S3 geminin, ana formunuzun dışında bulunan ayrı bir form oluşturup oluşturmadığını veya <form> başka bir <form>, geçersiz HTML içine gömülmeye çalışıp çalışmadığını görmek için oluşturulan HTML kodunu bize gösterin.

Eğer isterseniz, bu hat ile denetleyici içinde belirteç kontrolleri kapatabilirsiniz:

protect_from_forgery :except => :action_method 

burada docs bakınız: http://guides.rubyonrails.org/v5.0/working_with_javascript_in_rails.html#form-for ve burada http://guides.rubyonrails.org/v5.0/security.html#csrf-countermeasures

İlgili konular