Odoo 12 - 用于添加到心愿单的带有 AJAX 的无效 CSRF 令牌

问题描述

我目前在一家公司担任开发人员,其网站基于 odoo 12。 即使这个系统......在你的第一次实习中工作起来很复杂,但一切都很好。

首先我会解释为什么我想要这个,我的限制是什么,我在这一点上做了什么。

  1. 我目前正在开发一个配置器(用于计算机)并且它工作正常!现在是时候在有货的情况下添加到购物车(它有效)并添加到心愿单(如果没有)(这是问题)。
  2. 对于这些限制,我无权访问 python 端或代码。只有来自模型的 XML(HTML 和 CSS)(但我可以创建它们)。因此,我正在使用服务器端 XML/HTML 和 JS 完成所有工作。又可以了。
  3. 这就是我将展示的代码使用 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 版本添加到心愿单。为什么,因为添加到心愿单时没有重定向(而不是添加到购物车)。

就我而言,我没有任何代码可向您展示,因为我们选择不使用愿望清单。如果您需要一个示例,您可以通过添加到心愿单按钮查看如何在您自己的网站上制作示例。