0

我想使用 Angular 6.x Web 应用程序将 tornado 作为后端服务器。如果我现在向本地托管的服务器发送 POST 请求,请求会到达,但 tornado 会回复 403 打印以下内容:

'_xsrf' argument missing from POST 

由于我不想关闭 xsfr cookie,我现在需要一个解决方案,如何使用 Angular 6 添加这个特定的参数HttpClient。Angulars 官方文档仅声明,为所有请求设置了一个令牌。

有一个现已弃用的版本,它通过将以下内容添加到定义的提供程序列表中来工作app.module.ts。然而,文档只是说看看新的HttpClient,这不是很有帮助。

{
    provide: XSRFStrategy,
    useValue: new CookieXSRFStrategy('csrftoken', 'X-CSRFToken')
}

后端 cookie 在登录时设置如下:

def post(self):
    incorrect = self.get_secure_cookie("incorrect")
    if incorrect and int(incorrect) > 10:
        return

    getusername = tornado.escape.xheml_escape(self.get_argument("username"))
    getpassword = tornado.escape.xheml_escape(self.get_argument("password"))

    print(getusername)
    print(getpassword)

    if getusername == "admin" and getpassword == "admin":
        self.set_secure_cookie("user", self.get_argument("username"))
        self.set_secure_cookie("incorrect", "0")
        self.redirect(self.reverse_url("main"))
    else:
        incorrect = self.get_secure_cookie("incorrect") or 0
        increased = str(int(incorrect) + 1)
        self.set_secure_cookie("incorrect", increased)
        self.write("Wrong username or password")

我绝对看到这根本不安全,但是在进一步的开发过程中会增加更多的安全性。这只是让所有东西正常工作的一个基本示例。

也许你们中的一个人已经解决了这个问题,并且有一个解决方案,或者至少暗示了在哪里寻找。

4

1 回答 1

0

两件事情:

  1. 您正在尝试设置 CSRF cookie,而 Tornado 是之前已经设置过 cookie 的那个。
  2. 当您提交表单时,Tornado 期望您发送一个表单字段或一个 post 请求参数_xsrf,其值与 Tornado 设置的 cookie 相同。

如何修复它:

  1. 你要做的就是读取 Tornado 设置的 cookie 的值。cookie 的名称将是_xsrf.

  2. 然后,当您发送 POST 请求时,_xsrf在表单数据中包含一个使用 cookie 值调用的字段。

于 2018-10-02T16:07:18.473 回答