我在使用 Services 3.4 和 jQuery cookie 插件连接 Drupal 7 和 jQuery 时遇到了一些问题。据我了解,我需要执行以下操作: - 发布到服务端点 /user/login - 获取会话名称和会话 ID 并将它们添加为 http cookie - 获取会话令牌 ID - 将令牌 ID 添加为 http标头:X-CSRF-Token:sometoken
我使用 jQuery 尝试此方法并收到“用户匿名访问被拒绝”错误。我在两个子域中使用带有 CORS 模块的 Services 3.4。我的端点似乎设置正确,我的登录函数返回用户和会话数据,我得到一个令牌。
我已经根据这个示例测试了从 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);
}
});
}
});
});
});