Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
统一网络请求&x2B;Django:CSRF令牌丢失或不正确_Django_Unity3d_Csrf_Django Csrf - Fatal编程技术网

统一网络请求&x2B;Django:CSRF令牌丢失或不正确

统一网络请求&x2B;Django:CSRF令牌丢失或不正确,django,unity3d,csrf,django-csrf,Django,Unity3d,Csrf,Django Csrf,我从Django收到一个错误,“CSRF令牌丢失或不正确”及其标准错误消息。当您使用标准浏览器和Django服务器时,许多其他问题都包含了正确的回答,但我正试图让UnityWebRequest与Django配合良好 从概念上讲,我有两个步骤。首先,我在登录页面上调用一个GET请求,从我的表单中解析出csrfmiddlewaretoken,从set cookie头解析出csrftoken doLogin.SetRequestHeader ("referer", "ht

我从Django收到一个错误,“CSRF令牌丢失或不正确”及其标准错误消息。当您使用标准浏览器和Django服务器时,许多其他问题都包含了正确的回答,但我正试图让
UnityWebRequest
与Django配合良好

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

doLogin.SetRequestHeader ("referer", "https://dividedsky.herokuapp.com/accounts/login/");
doLogin.SetRequestHeader ("cookie", "csrftoken=" + csrfCookie);
doLogin.SetRequestHeader ("X-CSRFToken", csrfCookie);
然后,我制作了第二个UnityWebRequest,其中包括“referer”作为头,以及
csrftoken
作为cookie中的头。我会在表单中添加用户名和密码以及csrfmiddlewaretoken,但无论哪种方式都会出现错误

是否有其他要设置的标题或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);
UnityWebRequest登录页面=UnityWebRequest.Get(“https://dividedsky.herokuapp.com/accounts/login/");
返回loginPage.SendWebRequest();
if(loginPage.isNetworkError | | loginPage.isHttpError){
Debug.Log(loginPage.error);
屈服断裂;
}
//获取csrf cookie
字符串SetCookie=loginPage.GetResponseHeader(“设置cookie”);
Log(SetCookie);
Regex rxCookie=newregex(“csrftoken=(?。{64};”);
MatchCollection cookieMatches=rxCookie.Matches(SetCookie);
字符串csrfCookie=cookieMatches[0]。组[“csrf_令牌”]。值;
//获取中间件值
字符串loginPageHtml=loginPage.downloadHandler.text;
Regex rxMiddleware=新的Regex(“name='csrfmiddlewaretoken'value='(?。{64});
MatchCollection middlewareMatches=rxMiddleware.Matches(loginPageHtml);
字符串csrfMiddlewareToken=middlewareMatches[0]。组[“csrf_令牌”]。值;
/*
*发出登录请求。
*/
List formData=新列表();
//添加(新的MultipartFormDataSection(“username=false”);
//添加(新的MultipartFormDataSection(“password=notpass”);
//添加(新的MultipartFormDataSection(“csrfmiddlewaretoken=“+csrfmiddlewaretoken));
UnityWebRequest doLogin=UnityWebRequest.Post(“https://dividedsky.herokuapp.com/accounts/login/“,formData);
doLogin.SetRequestHeader(“referer”https://dividedsky.herokuapp.com/accounts/login/");
Log(doLogin.GetRequestHeader(“cookie”);
doLogin.SetRequestHeader(“cookie”,“csrftoken=“+csrfCookie”);
Log(doLogin.GetRequestHeader(“cookie”);
产生返回doLogin.SendWebRequest();
Log(doLogin.downloadHandler.text);
(2020年编辑:另见乔纳森的回复)

最后一个重要部分是设置
X-CSRFToken

doLogin.SetRequestHeader ("referer", "https://dividedsky.herokuapp.com/accounts/login/");
doLogin.SetRequestHeader ("cookie", "csrftoken=" + csrfCookie);
doLogin.SetRequestHeader ("X-CSRFToken", csrfCookie);

只是对这篇文章的一个更新,因为我自己正试图用这篇文章和Unity一起发布到Django。代码很好,只需进行一次更改。以下代码行将导致错误,不应与Unity 2018.3或更高版本一起使用

doLogin.SetRequestHeader(“cookie”,“csrftoken=“+csrfCookie”)

这是因为Unity管理cookie本身,所以您不应该设置cookie头。当我取出那行代码时,其余的代码对我有效