django - Unity Web 请求 + Django : CSRF token missing or incorrect

标签 django unity3d csrf django-csrf

我收到来自 Django 的错误消息,即“CSRF token 丢失或不正确”及其标准错误消息。当您使用标准浏览器和 Django 服务器时,许多其他问题都涵盖了正确的响应,但我试图让 UnityWebRequest 与 Django 很好地配合。

从概念上讲,我有两个步骤。首先,我在我的登录页面上调用 GET 请求,从我的表单中解析出 csrfmiddlewaretoken,并从 set-cookie 中解析出 csrftoken > 标题。

然后,我制作了第二个 UnityWebRequest,其中包含“referer”作为 cookie 中的 header 和 csrftoken 作为 header 。我会在表单中添加用户名和密码以及 csrfmiddlewaretoken,但无论哪种方式都会出现错误。

是否还有其他 header 或 cookie 需要设置?我认为我的问题是我试图在 Unity 中模拟 Web 浏览器的行为,这很复杂。

    UnityWebRequest loginPage = UnityWebRequest.Get("https://dividedsky.herokuapp.com/accounts/login/");
    yield return loginPage.SendWebRequest ();
    if(loginPage.isNetworkError || loginPage.isHttpError) {
        Debug.Log(loginPage.error);
        yield break;
    }

    // get the csrf cookie
    string SetCookie = loginPage.GetResponseHeader ("set-cookie");
    Debug.Log (SetCookie);
    Regex rxCookie = new Regex("csrftoken=(?<csrf_token>.{64});");
    MatchCollection cookieMatches = rxCookie.Matches (SetCookie);
    string csrfCookie = cookieMatches[0].Groups ["csrf_token"].Value;

    // get the middleware value
    string loginPageHtml = loginPage.downloadHandler.text;
    Regex rxMiddleware = new Regex("name='csrfmiddlewaretoken' value='(?<csrf_token>.{64})'");
    MatchCollection middlewareMatches = rxMiddleware.Matches(loginPageHtml);
    string csrfMiddlewareToken = middlewareMatches[0].Groups ["csrf_token"].Value;

    /*
     * Make a login request.
     */

    List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
    //formData.Add( new MultipartFormDataSection("username=fake") );
    //formData.Add (new MultipartFormDataSection ("password=notpass"));
    //formData.Add(new MultipartFormDataSection("csrfmiddlewaretoken=" + csrfMiddlewareToken));

    UnityWebRequest doLogin = UnityWebRequest.Post("https://dividedsky.herokuapp.com/accounts/login/", formData);

    doLogin.SetRequestHeader ("referer", "https://dividedsky.herokuapp.com/accounts/login/");
    Debug.Log (doLogin.GetRequestHeader ("cookie"));
    doLogin.SetRequestHeader ("cookie", "csrftoken=" + csrfCookie);
    Debug.Log (doLogin.GetRequestHeader ("cookie"));

    yield return doLogin.SendWebRequest ();

    Debug.Log (doLogin.downloadHandler.text);

最佳答案

只是对这篇文章的更新,因为我自己尝试使用它通过 Unity 发布到 Django。除了一次更改外,代码很好。以下代码行将导致错误,不应与 Unity 2018.3 或更高版本一起使用。

doLogin.SetRequestHeader ("cookie", "csrftoken="+ csrfCookie);

这是因为 Unity 自行管理 cookie,因此您不应设置 cookie header 。删除该行后,其余代码对我有用。

关于django - Unity Web 请求 + Django : CSRF token missing or incorrect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50313537/

相关文章:

web-applications - Unity、Torque3D、Google O3D、WebGl....选择哪个?

ruby-on-rails-3 - 无法验证 jQuery 文件上传的 CSRF token ,仅限 IE 9,Rails 3 应用程序

php - 是否有特定的方法可以使用 Zend Framework 防止 CSRF/XSRF?

django 管理站点模型未显示

django - 如何将额外数据附加到 django 中现有的序列化器

c# - 为对象添加相对于其局部轴的速度

unity3d - 如何防止 Ridigbody 穿墙?

jquery - 如何在表单的 AJAX post 请求中传递 CSRF token ?

python - Django 错误 ---index() 缺少 1 个必需的位置参数 : 'pk'

python - 管理中的 Django 自定义 ListView