那么,我有一个rails 3应用程序使用设计来处理身份验证。我有另一个网站(所有客户端javascript),正试图登录到这个rails 3应用程序使用ajax基本身份验证,像这样:
username = "test@testing.com"
password = "testing"
$.ajax({
'url': '/users/sign_in',
'otherSettings': 'othervalues',
'beforeSend': function(xhr) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password))
},
sucess: function(result) {
alert('done');
}//sicc
});
它正确地命中路由,我可以看到rails方面的一切看起来都很好(服务器甚至认为它正在重定向),但如果我然后尝试命中需要身份验证的路由(使用jquery,加载json数据),我得到一个丑陋的基本auth javascript弹出告诉我我需要身份验证。
设计显然不使用cookie来存储验证数据,从我的理解,你不能只是从javascript访问HttpSession…我能做什么,或者我只需要使用身份验证令牌(并编写一个自定义控制器来返回这个给我)。
编辑:即使是具有基本权限的帖子也不起作用,这很奇怪(因为回想起来,是的,这是我试图达到的帖子路线)。我得到一个401未经验证的错误…为什么您需要经过身份验证才能进行身份验证?让type be 'GET '工作得很好,虽然,但是(再一次,回想起来)击中了'new'路线而不是'create'。
username = "test@testing.com"
password = "testing"
$.ajax({
'url': '/users/sign_in',
'type': 'POST',
'otherSettings': 'othervalues',
'beforeSend': function(xhr) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password))
},
sucess: function(result) {
alert('done');
}//sicc
});
编辑:只是为了确认,它似乎不是一个问题与应用程序控制器中的"protect_from_forgery"行,要么…至少,当我把它注释掉时,我仍然有同样的问题。
没关系,问题似乎是,当我张贴基本认证,我在用户名中有一个错别字,显然身份验证失败的处理方式是弹出基本认证对话框(非常不优雅,顺便说一句)
解决方案:
username = "test@testing.com"
password = "testing"
$.ajax({
'url': '/users/sign_in',
'type': 'POST',
'otherSettings': 'othervalues',
'beforeSend': function(xhr) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password))
},
sucess: function(result) {
alert('done');
}//sicc
});
是否有任何原因导致您不能在POST数据中发送用户名和密码?
var username = "test@testing.com";
var password = "testing";
$.ajax({
url: '/users/sign_in',
type: 'post',
data: 'username=' + username + '&password=' + password
success: function(result) {
alert('done');
}//sicc
});
首先进行设置。
/config/初始化/devise.rb设置配置。Http_authenticatable = true这将允许您通过HTTP进行身份验证设置配置。http_authenticatable_on_xhr = true(默认为true)
现在重启
现在for Sign_in:
username = "a@a.com";
password = "b";
$.ajax({
'url': '/users/sign_in',
'type': 'POST',
'otherSettings': 'othervalues',
'beforeSend': function(xhr) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password))
},
sucess: function(result) {
alert('done');
}
});
And Sign out:
$.ajax({
'url': '/providers/sign_out',
'type': 'DELETE',
'otherSettings': 'othervalues',
sucess: function(result) {
alert('done');
}
});