Drupal 7

时间:2018-03-21 20:48:47

标签: angularjs ajax drupal-7

我一直在搜索和搜索,包括这里的许多主题,以解决我的问题。到目前为止,我没有运气。 有点背景故事:我正在编写一个以Drupal 7作为后端的AngularJS应用程序。我能够毫无问题地登录,保存会话名称和会话ID,并将它们放在一起以获得Cookie标头(I had to use this "hack")。此外,如果我在Postman应用程序中进行了登录调用,然后尝试更新节点,它就可以了。这让我觉得会话身份验证存在问题,但我仍然无法弄明白。

话虽这么说,我正处在路障中。每当我尝试PUT更新节点时,我都会收到以下错误:

401 (Unauthorized : CSRF validation failed)

现在,我的ajax调用如下所示:

  $http({
  method: 'PUT',
  url: CONSTANTS.SITE_URL+"/update/node/"+target_nid,
  headers:{
    'Content-Type': CONSTANTS.CONTENT_TYPE,
    'Authentication': CONSTANTS.SESS_NAME +"="+CONSTANTS.SESS_ID,
    'X-CSRF-Token' : CONSTANTS.TOKEN
  },
  data: {
    (JSON stuff)
  }
})

CONTENT_TYPE是“application / json”,“Authentication”是Cookie头问题的创可贴,而“X-CSRF-Token”就是(大概)给我的问题。 SESS_NAME,SESS_ID和TOKEN都是从Login的回复中收集的。我可以在网站上提取用户制作的列表,我也可以在网站上提取特定类型的所有节点的列表。当我尝试PUT更新节点时,我只遇到了一个问题。

如果我错过了任何信息,请告诉我,我会添加它!

编辑:我正在使用AngularJS 1.5.3版。

2 个答案:

答案 0 :(得分:0)

在尝试了其他所有内容之后,我在我原始帖子开头的链接中跟踪了其中一条评论。他们不得不在Services.module中注释掉一行:

if ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services')) {
  //return t('CSRF validation failed');
}

它在590行左右,加上或减去几个,取决于你对文件的混淆程度。我不喜欢这样做,但我不能为我的生活弄清楚为什么令牌不能正常工作。这肯定是一个临时修复,但如果有人在未来遇到同样的问题,那么希望能帮到你!

答案 1 :(得分:0)

除了删除该行之外,您还可以向drupal_valid_token添加一个真值

if ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services',true)) {
  return t('CSRF validation failed');
}