2015-05-04 3 views
0

Я пробовал и искал много ответов здесь и на других веб-страницах, но я трачу весь день и до сих пор не могу этого сделать.Django CSRFTOKEN и проблемы с клиентом android

Друг строит бэкэнд django, и он просит меня создать приложение для Android, чтобы подключиться к этому бэкэнду, лучшим результатом было это Android Client login to a Django server, how to pass crsf :|, но я не могу заставить его работать, я получаю CSRF с сервера, но потом я попробуйте использовать URLConnection, HttpClient, HttpPost, множество других примеров и ничего.

Сейчас мой код:

// Create a new HttpClient and Post Header 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://URL-TO-SERVER/"); 
     String CSRFTOKEN = getCsrfFromUrl("http://URL-TO-SERVER/"); 

      // Add your data 
      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("username", mEmail)); 
      nameValuePairs.add(new BasicNameValuePair("password", mPassword)); 
      nameValuePairs.add(new BasicNameValuePair("csrfmiddlewaretoken", CSRFTOKEN)); 
     try { 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      httppost.setHeader("X-CSRFToken", CSRFTOKEN); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 

     final BasicCookieStore cookieStore = new BasicCookieStore(); 
     BasicClientCookie csrf_cookie = new BasicClientCookie("X-CSRFToken", CSRFTOKEN); 
     csrf_cookie.setDomain("URL-SERVER"); 
     cookieStore.addCookie(csrf_cookie); 
     // Create local HTTP context - to store cookies 
     HttpContext localContext = new BasicHttpContext(); 
     // Bind custom cookie store to the local context 
     localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
     // Execute HTTP Post Request 
     HttpResponse response = null; 
     try { 
      Log.e(TAG,"Token: "+CSRFTOKEN); 

      response = httpclient.execute(httppost, localContext); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(response.getAllHeaders()); 

     try { 
      System.out.println(EntityUtils.toString(response.getEntity())); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

и getCsrfFromUrl() находится по ссылке. И в

nameValuePairs.add(new BasicNameValuePair("csrfmiddlewaretoken", CSRFTOKEN)); 

Я попытался изменить ключ для csrftoken, для X-CSRFToken и я до сих пор не знаю, что это неправильно или как я могу получить его работу, может быть, проблема в интерфейсе? Отсутствует функция или ключ? Что я пытаюсь сделать, это войти на страницу, где мне нужно указать имя пользователя и пароль, а затем вспомнить ответ, чтобы узнать, кто входит и работает с этими данными.

+0

Функция 'getCsrfFromUrl' из другого вопроса не работает. – aumo

+0

См. Http://stackoverflow.com/questions/22660848/android-with-django-how-to-keep-user-logged-in – Othman

ответ

0

getCsrfFromUrl, что вы используете глючит, он возвращает первое печенье, найденный в ответ без проверки, если это CSRF печенье, это один должен работать:

public String getCsrfFromUrl(String url) { 
    HttpGet httpGet = new HttpGet(url); 
    HttpResponse httpResponse = httpClientStatic.execute(httpGet); 
    HttpEntity httpEntity = httpResponse.getEntity(); 

    List<Cookie> cookies = httpClientStatic.getCookieStore().getCookies(); 

    for (Cookie cookie : cookies) { 
    if (cookie.getName().equals("csrftoken")) { 
     return cookie.getValue(); 
    } 
    } 
    return null; // Or throw exception. 
} 

Вы можете использовать возвращаемое значение как параметр POST.

Хотя, как упоминалось в комментариях к вопросу, который вы связали, вам не нужна защита CSRF для просмотров, доступных вашему Android-приложению.

Смежные вопросы