发送ajax POST请求时,Devise拒绝对我进行身份验证 我错过了什么?
控制器
class SeenEpisodesController < ApplicationController
before_filter :authenticate_user! #Devise
def mark_episode
#do stuff
respond_to do |format|
format.js
end
end
end
的Javascript
尝试设置标头和有效负载。
$.ajax({
type: "POST",
url: url,
dataType: "script",
data: {
authenticity_token: encodeURIComponent($('meta[name="csrf-token"]').attr('content'))
},
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
}
});
我也尝试过不自行设置令牌。 jquery_ujs
为我设置标题!
是的,我的布局中有<%= csrf_meta_tags %>
。
Javascript清单
//= require jquery
//= require jquery_ujs #Have tried with or without
Rails控制台输出
Processing by SeenEpisodesController#mark_episode as JS
Parameters: {"mark"=>"1", "episode_id"=>"887795", "season_id"=>"65577"}
Completed 401 Unauthorized in 9ms
Started GET "/account/sign_in.js" for 192.168.0.10 at 2015-02-28 19:44:18 +0100
Processing by Devise::SessionsController#new as JS
开发工具网络输出
答案 0 :(得分:0)
%253D
- 尝试解码authenticity_token
的这一部分。它将等于=
。所以,似乎你错误地编码authenticity_token
(两次)。
答案 1 :(得分:0)
使用jQuery发布时,您不需要encodeURIComponent
。无论如何,jQuery会为您编码数据,这会导致您的数据被编码两次,这将导致提交无效的真实性令牌。