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

Odoo 12 - Invalid CSRF Token with AJAX for adding to wishlist

我目前在一家公司担任开发人员,该公司的网站基于 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,
                    type: 'POST',
                    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)");
                    },
                    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;
                            }
                        }
                    },
                });
            }

        }

        // window.location.href = "/shop/cart/";
    }
}

所以 'cart' 部分效果很好 (url: '/shop/cart/update',) 但 'wishlist' 部分效果不好 (url: '/shop/wishlist/add')。

我迷失在愿望清单的 CSRF 令牌中。 官方方式使用9位数字,但我不知道如何find/get它。

使用 9 位数字之一或我当前使用的那个,我有(毫无意外)这些消息:

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.: 我看到了这个() but I'm not sure about security. Maybe this one can help ().

大家下午好,

对于这个问题,我没有找到声明此 CSRF 令牌的方法,但有一个解决方法。

我们可以使用形式版本添加到心愿单。为什么,因为添加到心愿单时没有重定向(而不是添加到购物车)。

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