【发布时间】:2013-07-31 15:54:55
【问题描述】:
我在使用 Services 3.4 和 jQuery cookie 插件连接 Drupal 7 和 jQuery 时遇到了一些问题。据我了解,我需要执行以下操作: - 发布到服务端点 /user/login - 获取会话名称和会话 ID 并将它们添加为 http cookie - 获取会话令牌 ID - 添加token id作为http header: X-CSRF-Token: sometoken
我使用 jQuery 尝试此方法并收到 'Access denied for user anonymous' 错误。我在两个子域中使用带有 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);
}
});
}
});
});
});
【问题讨论】:
-
不确定 jQuery 版本,但有一个(有效的)PHP 实现新的身份验证工作流here;你也许可以从直接移植该代码中获得一些好处
-
我最初是从 Drupal 文档中发布的类似脚本开始的。但是,我总是想确认问题出在哪里,所以我实现了您链接到的更好的 PHP/curl 解决方案。我能够像示例中一样注册用户,并根据多个用户的权限级别创建节点。我遇到的问题更多地与客户端身份验证有关,尤其是 jQuery 和 AngularJS。在遇到 Angular 问题后,我转而使用更熟悉的框架,但也遇到了类似的问题。
-
如何通过调用 PHP/CURL 请求登录用户?
标签: jquery rest drupal service drupal-7