我在使用Services 3.4和jQuery cookie插件连接Drupal 7和jQuery时遇到了一些麻烦。据我了解,我需要做以下事情: - 发布到服务端点/用户/登录 - 获取会话名称和会话ID,并将其添加为http cookie - 获取会话令牌ID - 将标记ID添加为http标头:X-CSRF-Token:sometoken
我使用jQuery尝试此方法,并收到'拒绝访问用户匿名'错误。我在两个子域中使用带有CORS模块的Services 3.4。我的端点似乎设置正确,我的登录功能返回用户和会话数据,我得到一个令牌。
我已经测试过基于this example的PHP脚本访问服务。我修改了这个例子来创建节点。它按预期工作,尊重Drupal的权限。
在收到有关标头中标记的错误后,我对自定义模块中的标头进行了以下更改。
function custom_services_init() {
drupal_add_http_header('Access-Control-Allow-Headers', 'X-CSRF-Token');
}
这是我的jQuery代码:
$('#menu-connect').click(function() {
var url = 'http://myservice.com/service_endpoint/user/login.json';
$.post(url, { username: 'testuser', password: 'password' }, function(data) {
sessName = data.session_name;
sessId = data.sessid;
$.cookie(sessName, sessId);
// Obtain session token.
$.ajax({
url:"http://myservice.com/services/session/token",
type:"get",
dataType:"text",
error:function (jqXHR, textStatus, errorThrown) {
alert(errorThrown);
},
success: function (token) {
$.ajax({
url: 'http://myservice.com/service_endpoint/user/1.json',
type: "get",
dataType: "json",
beforeSend: function (request) {
request.setRequestHeader("X-CSRF-Token", token);
},
error: function (jqXHR, textStatus, errorThrown) {
alert(errorThrown);
},
success: function (data) {
alert('Hello user #' + data.user.uid);
}
});
}
});
});
});
答案 0 :(得分:1)
评论#60 @ https://drupal.org/node/2013781#comment-7764881中添加了一个补充内容(但我错过了10次左右)。
在jQuery中,您必须设置要传递的凭据。否则,您将永远不会获得服务器的cookie来记住您。
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
**注意:此用法会影响所有 ajax调用(在我的情况下,我想要,所以我使用上面的方法)。如果您需要不同的东西,可以将它包含在$ .ajax参数中。