我一直在搜索和搜索,包括这里的许多主题,以解决我的问题。到目前为止,我没有运气。 有点背景故事:我正在编写一个以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版。
答案 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');
}