0

我试着

  1. From React/S3 - 从外部站点(EC2)的主体中检索 CSRF

  2. 提交表单数据(电子邮件/密码)以及检索到的 CRSF 和指定数据库的自定义标题

  3. 重定向用户浏览器。

CSRF 参与进来

var xhr = new XMLHttpRequest();
    xhr.onload = function() {
      var csrfToken = this.responseXML.getElementsByName('csrf_token')[0].getAttribute('value');
    }
    xhr.open("GET", "url");
    xhr.responseType = "document";
    xhr.send();

并且页面重定向为

var req = new XMLHttpRequest();
    req.onreadystatechange = function (aEvt) {
      
      if (req.readyState == 4) {
        
        if(req.status == 200)
         
          document.write(req.responseText);
        else
          alert("Error loading page\n");
      }
    };
    
    req.setRequestHeader("X-Odoo-dbfilter", 'data'); 
    req.setRequestHeader("x-crsf-token", csrfToken);
    req.send();

我已经能够提交带有以下内容的纯html表单;

const form = document.createElement('form');
    form.method = method;
    form.action = path;

    for (const key in params) {
      if (params.hasOwnProperty(key)) {
        const hiddenField = document.createElement('input');
        hiddenField.type = 'hidden';
        hiddenField.name = key;
        hiddenField.value = params[key];

        form.appendChild(hiddenField);
      }
    }

    document.body.appendChild(form);
    form.submit();

但是结合这种逻辑一直存在问题。我正在努力寻找一种允许我提交表单数据、自定义标题和重定向用户的方法。在我最近的尝试中,我尝试使用 fetch

fetch('url', {
  method: "POST", // *GET, POST, PUT, DELETE, etc.
  mode: "no-cors", // no-cors, cors, *same-origin
  cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
  credentials: "include", // include, *same-origin, omit
  headers: {
      //"Content-Type": "application/json",
      "Content-Type": "application/x-www-form-urlencoded",
      "X-Odoo-dbfilter": "data"

  },
  redirect: "follow", // manual, *follow, error
  referrer: "no-referrer", // no-referrer, *client
  body: formData, // body data type must match "Content-Type" header
})
.then(response => {
    
    if (response.redirected) {
        window.location.href = response.url;
    }
})
.catch(function(err) {
    console.info('here be errors');
});

但仍然不清楚哪种方法最好。

4

0 回答 0