Я получаю сообщение об ошибке от 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);