Angular Post请求上缺少_xsrf参数

时间:2018-10-02 14:08:09

标签: angular security tornado x-xsrf-token

我想使用Angular 6.x Web应用程序将龙卷风用作后端服务器。如果现在我向本地托管的服务器发送POST请求,则请求到达,但龙卷风答复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")

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

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

1 个答案:

答案 0 :(得分:0)

两件事:

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

如何修复:

  1. 您需要做的是读取Tornado设置的cookie的值。 Cookie的名称为_xsrf

  2. 然后,在发送POST请求时,在表单数据中包含一个名为_xsrf的字段,其中包含cookie的值。