Unity Web Request + Django: токен CSRF отсутствует или неверен - PullRequest
0 голосов
/ 13 мая 2018

Я получаю сообщение об ошибке от Django о том, что «токен CSRF отсутствует или неверен» вместе со стандартным сообщением об ошибке.Многие другие вопросы касались правильного ответа, когда вы работаете со стандартным браузером и сервером Django, но я пытаюсь заставить UnityWebRequest хорошо играть с Django.

Концептуально, у меня есть два шага,Сначала я вызываю запрос GET на своей странице входа в систему, анализируя csrfmiddlewaretoken из моей формы и csrftoken из заголовка set-cookie.

Затем я создаю второй запрос UnityWebRequest, которыйвключает "referer" в качестве заголовка и csrftoken в качестве заголовка в файлах cookie.Я бы добавил в форму имя пользователя и пароль и csrfmiddlewaretoken, но ошибка присутствует в любом случае.

Существуют ли другие заголовки или файлы cookie для установки?Я предполагаю, что моя проблема в том, что я пытаюсь эмулировать поведение веб-браузера в Unity, и это сложно.

    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);

1 Ответ

0 голосов
/ 17 мая 2018

Получается, что последней важной частью было установить заголовок X-CSRFToken.

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