3

我在使用 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);
              }
            });
          }
        });     
    });     

});
4

1 回答 1

1

只是评论 #60 @ https://drupal.org/node/2013781#comment-7764881中包含的一个补充(但我错过了 10 次左右)。

在 jQuery 中,您必须设置要传递的凭据。否则,您将永远无法让服务器记住您的 cookie。

    $.ajaxSetup({
        xhrFields: {
            withCredentials: true
        }
    });

**注意:这种用法会影响所有ajax 调用(在我的情况下,我想要,所以我使用上述方法)。如果您需要不同的东西,您可以将其包含在 $.ajax 参数中。

于 2014-05-04T18:28:05.003 回答