【问题标题】:Drupal 7 Services 3.4 with session authentication and jQuery带有会话身份验证和 jQuery 的 Drupal 7 Services 3.4
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢你!我已经尝试了 2 天的各种解决方案,但没有任何运气。你的工作完美!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2016-04-24
  • 2020-09-01
  • 2023-03-14
相关资源
最近更新 更多