Drupal 7 中的 CSRF 验证失败
CSRF Validation Failed in Drupal 7
我一直在寻找解决我的问题的方法,包括这里的许多主题。到目前为止我没有运气。
一些背景故事:我正在用 Drupal 7 作为后端编写一个 AngularJS 应用程序。我可以毫无问题地登录,保存 Session 名称和 Session ID,并将它们放在一起作为 Cookie header (I had to use this "hack")。此外,如果我在 Postman 应用程序中进行登录调用,然后尝试更新节点,它就可以工作。这让我觉得 session 身份验证有问题,但我还是想不通。
话虽如此,我遇到了障碍。每当我尝试 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 header问题的band-aid,"X-CSRF-Token"是什么是(大概)给我的问题。 SESS_NAME、SESS_ID 和 TOKEN 都是从登录时的响应中收集的。我可以拉取用户在网站上制作的列表,我也可以拉取网站上某种类型的所有节点的列表。当我尝试 PUT 更新节点时,我只 运行 遇到了问题。
如果我遗漏了任何信息,请告诉我,我会添加!
编辑:我正在使用 AngularJS 版本 1.5.3。
在尝试了所有其他方法之后,我遵循了我在原始 post 开头链接的线程中的一条评论。他们不得不在 Services.module 中注释掉一行:
if ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services')) {
//return t('CSRF validation failed');
}
它在第 590 行左右,根据您对文件的处理程度进行加减。我不喜欢这样做,但我终其一生都无法弄清楚为什么令牌无法正常工作。当然,这是一个临时修复,但如果将来有人遇到同样的问题,它希望能帮助你!
除了删除该行,您还可以向 drupal_valid_token
添加一个 true
if ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services',true)) {
return t('CSRF validation failed');
}
我一直在寻找解决我的问题的方法,包括这里的许多主题。到目前为止我没有运气。 一些背景故事:我正在用 Drupal 7 作为后端编写一个 AngularJS 应用程序。我可以毫无问题地登录,保存 Session 名称和 Session ID,并将它们放在一起作为 Cookie header (I had to use this "hack")。此外,如果我在 Postman 应用程序中进行登录调用,然后尝试更新节点,它就可以工作。这让我觉得 session 身份验证有问题,但我还是想不通。
话虽如此,我遇到了障碍。每当我尝试 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 header问题的band-aid,"X-CSRF-Token"是什么是(大概)给我的问题。 SESS_NAME、SESS_ID 和 TOKEN 都是从登录时的响应中收集的。我可以拉取用户在网站上制作的列表,我也可以拉取网站上某种类型的所有节点的列表。当我尝试 PUT 更新节点时,我只 运行 遇到了问题。
如果我遗漏了任何信息,请告诉我,我会添加!
编辑:我正在使用 AngularJS 版本 1.5.3。
在尝试了所有其他方法之后,我遵循了我在原始 post 开头链接的线程中的一条评论。他们不得不在 Services.module 中注释掉一行:
if ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services')) {
//return t('CSRF validation failed');
}
它在第 590 行左右,根据您对文件的处理程度进行加减。我不喜欢这样做,但我终其一生都无法弄清楚为什么令牌无法正常工作。当然,这是一个临时修复,但如果将来有人遇到同样的问题,它希望能帮助你!
除了删除该行,您还可以向 drupal_valid_token
添加一个 trueif ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services',true)) {
return t('CSRF validation failed');
}