Drupal 7 Services 3.4具有会话身份验证和jQuery

时间:2013-07-31 15:54:56

标签: jquery rest drupal service drupal-7

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

});

1 个答案:

答案 0 :(得分:1)

评论#60 @ https://drupal.org/node/2013781#comment-7764881中添加了一个补充内容(但我错过了10次左右)。

在jQuery中,您必须设置要传递的凭据。否则,您将永远不会获得服务器的cookie来记住您。

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

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