1

Ember.js フロントエンドを備えた Rails 4.0 アプリがあります。認証を処理するために、Devise と組み合わせて Ember-Auth を使用しています。ほとんどの場合、すべてが機能します。ただし、Jquery File Upload を使用すると、サーバーに対する後続のすべてのクエリで InvalidAuthenticityToken エラーが発生します。ファイルのアップロード自体は完全に機能しますが、たとえば、後で組織のインデックス ページにアクセスすると、エラーが発生します。ページをリロードすると、エラーが発生しなくなり、別のアップロードを実行するまですべてが正常に機能します。

アップローダーは次のようになります。

didInsertElement: ->
  $('#image_upload').fileupload
    url: "/images"
    formData: [{ name: 'auth_token', value: Whistlr.Auth.get('authToken') }]
    success: (response) =>
      @get('parentView').get('controller').set('image_token', response.token)

URL 以外をすべて削除しても、後で InvalidAuthenticityToken を取得します。何が起こっているのか分かりますか?

4

1 に答える 1

0

セッションがリセットされているのではないかと疑ったため、サーバーからクライアント側にauthenticity_tokenを返そうとしました。案の定、変わっていました。そのため、ヘッダーに新しいauthenticity_tokenを手動で配置しました。コードは次のようになります。

def create
  image = Image.create(image_params)
  render json: {image: image, authenticity_token: form_authenticity_token}, status: 201
end

$('#image_upload').fileupload
  url: "/images"
  dataType: "json"
  formData: [{ name: 'auth_token', value: Whistlr.Auth.get('authToken') }]
  success: (response) =>
    @get('parentView').get('controller').set('image_token', response.image.token)
    $('meta[name="csrf-token"]').attr('content', response.authenticity_token)

csrf-token を置き換える JavaScript の最後の行に注意してください。ありがたいことに、これは機能します。私が知る限り、それも安全です。(セキュリティ上の欠陥を見つけたら、私に知らせてください!) しかし、これが必要なことはまだ奇妙に思えます。私のアプリの他の場所では、csrf-token を手動で置き換える必要はありません。なぜこれがここで起こっているのですか?セッションがリセットされているためですか?もしそうなら、なぜここで起こっているのに他の場所では起こっていないのですか?

于 2013-09-17T20:14:53.750 に答える