如何解决Odoo 12 - 用于添加到心愿单的带有 AJAX 的无效 CSRF 令牌
我目前在一家公司担任开发人员,其网站基于 odoo 12。 即使这个系统......在你的第一次实习中工作起来很复杂,但一切都很好。
首先我会解释为什么我想要这个,我的限制是什么,我在这一点上做了什么。
- 我目前正在开发一个配置器(用于计算机)并且它工作正常!现在是时候在有货的情况下添加到购物车(它有效)并添加到心愿单(如果没有)(这是问题)。
- 对于这些限制,我无权访问 python 端或代码。只有来自模型的 XML(HTML 和 CSS)(但我可以创建它们)。因此,我正在使用服务器端 XML/HTML 和 JS 完成所有工作。又可以了。
- 这就是我将展示的代码使用 JS(使用 AJAX)的原因:
// Add to cart
function cookieConfigAddToCart() {
// [ID][isInStock]
// 12671 is 'montage'
let cookieSelectedIds = [['12671',true]];
// for each selected products,push his ID in the 'cookieSelectedIds'
for (let i = cookieSelectedProducts.length - 1; i >= 0; i--) {
if (cookieSelectedProducts[i].hasAttribute('p-id')) {
cookieSelectedIds.push([
cookieSelectedProducts[i].getAttribute('p-id'),cookieSelectedProducts[i].getAttribute('p-isinstock') === 'true'
]);
}
}
console.log(cookieSelectedIds);
// For each selected products,send a query
// to the server to update the cart
if (cookieSelectedIds.length > 1) {
for (let i = cookieSelectedIds.length - 1; i >= 0; i--) {
let errorAddToCart = false;
if (cookieSelectedIds[i][1]) {
$.ajax({
async: false,type: 'POST',url: '/shop/cart/update',data: {
csrf_token: document.getElementById('cookieConfigAddToCartToken').innerHTML,product_id: cookieSelectedIds[i][0]
},success: function() {
console.log(i+": OK (CART)");
},error: function() {
for (let y = cookieSelectedProducts.length - 1; y > 0; y--) {
if (cookieSelectedProducts[y].getAttribute('p-id') == cookieSelectedIds[i][0]) {
console.error(
"Il y a eu une erreur pendant l'envoi au serveur du produit: "
+ cookieSelectedProducts[y].innerHTML
);
console.log("Veuillez réessayer ultérieurement");
break;
}
}
},});
}
else {
$.ajax({
async: false,url: '/shop/wishlist/add',data: {
id: document.getElementById('cookieConfigAddToCartToken').innerHTML,jsonrpc: "2.0",method: "call",params: '{product_id: '+cookieSelectedIds[i][1]+'}'
},success: function() {
console.log(i+": OK (WISHLIST)");
},});
}
}
// window.location.href = "/shop/cart/";
}
}
所以“购物车”部分运行良好(url: '/shop/cart/update',
)但不是“愿望清单”部分(url: '/shop/wishlist/add'
)。
我迷失在心愿单的 CSRF 令牌中。 官方方式使用9位数字,但我不知道如何查找/获取它。
使用 旧 9 位数字 1 或我目前使用的数字,我收到(毫无意外)以下消息:
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_http.py",line 234,in _dispatch
result = request.dispatch()
File "/home/odoo/src/odoo/odoo/http.py",line 807,in dispatch
raise werkzeug.exceptions.BadRequest('Session expired (invalid CSRF token)')
werkzeug.exceptions.BadRequest: 400 Bad Request: Session expired (invalid CSRF token)
那么我的问题是(因为我没有访问权限,也不想禁用CSRF令牌)。如何用 AJAX 声明一个?
感谢您的阅读,希望我们能一起找到解决方案。
P.S.:我看到了这个 (https://stackoverflow.com/a/41486127/13147732),但我不确定安全性。也许这个可以帮助(https://stackoverflow.com/a/53151896/13147732)。
解决方法
大家下午好,
对于这个问题,我没有找到声明这个CSRF令牌的方法,但是有一个解决方法。
我们可以使用 form 版本添加到心愿单。为什么,因为添加到心愿单时没有重定向(而不是添加到购物车)。
就我而言,我没有任何代码可向您展示,因为我们选择不使用愿望清单。如果您需要一个示例,您可以通过添加到心愿单按钮查看如何在您自己的网站上制作示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。