2015-12-30 3 views
1

Я пытаюсь создать правильный запрос для Twitter-токена авторизации только для приложений, используя запрос POST-запроса, но я продолжаю получать ответ Http 400 (Bad Request).Получение токена авторизации Twitter с запросом POST Volley

Это то, что я пробовал:

URL

private static final String TWITTER_API_AUTH_URL = "https://api.twitter.com/oauth2/token"; 

Кодирование ключ потребителя и секрет потребителя

try { 
    byte[] data = (URLEncoder.encode(TWITTER_CONSUMER_KEY, "UTF-8") + ":" + URLEncoder.encode(TWITTER_CONSUMER_SECRET, "UTF-8")).getBytes("UTF-8"); 
    mEncodedKeyAndSecret = Base64.encodeToString(data, Base64.DEFAULT); 
} catch (UnsupportedEncodingException e) { 
    //handleError 
} 

Пользовательские Volley StringRequest

private class TokenRequestWithAuthHeader extends StringRequest{ 

    public TokenRequestWithAuthHeader (int method, String url, Response.Listener listener, Response.ErrorListener errorListener) 
    { 
     super(method, url, listener, errorListener); 
    } 

    @Override 
    public Map getHeaders() throws AuthFailureError { 
     Map headers = new HashMap(); 
     headers.put("Content-Length", String.valueOf(getBody().length)); 
     headers.put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
     headers.put("Authorization", "Basic " + mEncodedKeyAndSecret); 
     return headers; 
    } 

    @Override 
    public byte[] getBody() { 
     return ("grant_type=client_credentials").getBytes(); 
    } 
} 

Отправка запроса

tokenRequest = new TokenRequestWithAuthHeader 
       (Request.Method.POST, TWITTER_API_AUTH_URL, mCallback.getTokenResponseListener(), mCallback); 
requestQueue.add(tokenRequest); 

Documentation about Application-Only authentication at dev.twitter.com

Я также попытался расширение JsonObjectRequest и JsonRequest вместо StringRequest, тот же самый результат.

Может кто-то помочь определить, в чем проблема с запросом?

+0

Вы получили успешный ответ при использовании некоторых инструментов, таких как почтальон? – BNK

+0

Я сгенерировал запрос на www.hurl.it с закодированным основным заголовком проверки подлинности, который я распечатал в LogCat, после его создания из того же кода, который я использовал выше, используя тот же заголовок типа контента и получил ожидаемый ответ успеха 200. Я довольно озадачен :) – 2Dee

+0

Если только для тестирования или обучения, можете ли вы опубликовать TWITTER_CONSUMER_KEY и TWITTER_CONSUMER_SECRET или закодированный заголовок базовой аутентификации, чтобы мы могли проверить? – BNK

ответ

2

Я только что проверил с полномочиями, которые вы предоставили в комментариях. Он работает со следующим выходом LogCat (я усечен содержание реального лексемы доступа)

I/onResponse: {"access_token":"AAAAAAAAAAAAAAAAAAAAAIwbjgAAAAAAGVMKCDU9taD0ke3sStAyA2WKszs%3DA4nfnpLTF31YuE.............JFtKjrTQC1K","token_type":"bearer"} 

Мой код:

  final RequestQueue queue = Volley.newRequestQueue(this); 
      final String url = "https://api.twitter.com/oauth2/token"; 
      final String requestBody = "grant_type=client_credentials"; 
      JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, requestBody, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.i("onResponse", response.toString()); 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("onErrorResponse", error.toString()); 
       } 
      }) { 
       @Override 
       public Map<String, String> getHeaders() throws AuthFailureError { 
        Map<String, String> headers = new HashMap<>(); 
        // Basic Authentication 
        //String auth = "Basic " + Base64.encodeToString(CONSUMER_KEY_AND_SECRET.getBytes(), Base64.NO_WRAP); 
        String auth = "Basic cjMzZXVWeG5ZSDN3NjJ1RUdhV1NtcDAzYzpDa0h5Q3N1ZXF5ZXVobTExWURnTmpKMUZWRFN6OEk5TDFXWXJVUTFQWTNPZTcxcWlGdQ=="; 
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
        headers.put("Authorization", auth); 
        return headers; 
       } 
      }; 
      queue.add(jsonObjectRequest); 
+0

Спасибо, позвольте мне дать ему попробовать после еды! – 2Dee

+0

Работает как шарм, еще раз спасибо! Stil не уверен, что случилось с реализацией JSONRequest, которую я пробовал раньше, выглядит очень похоже. Я выложу мои выводы здесь, если я когда-либо иметь смысл этого :) – 2Dee

+0

'TokenRequestWithAuthHeader requestWithAuthHeader = новый TokenRequestWithAuthHeader (1, URL, новый Response.Listener () { @Override общественного недействительными onResponse (ответ String) { Log.i (LOG_TAG, ответ); }} , новый Response.ErrorListener() { @Override общественного недействительными onErrorResponse (VolleyError ошибка) { Log.e (LOG_TAG, ошибка.нанизывать()); } }); queue.add (requestWithAuthHeader); 'работает тоже :) – BNK

-1

частные недействительными fetchAccessTokens() { финальные строки requestBody = "grant_type = client_credentials";

JsonObjectRequest req1 = new JsonObjectRequest(Request.Method.POST, 
      TwitterTokenURL, 
      null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.i("Response: ", response.toString()); 

        fetchTweets(response.toString()); 

       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }){ 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String, String> headers = new HashMap<>(); 

      // URL encode the consumer key and secret 
      String urlApiKey = null; 
      String urlApiSecret = null; 
      try { 
       urlApiKey = URLEncoder.encode(CONSUMER_KEY, "UTF-8"); 
       urlApiSecret = URLEncoder.encode(CONSUMER_SECRET, "UTF-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 

      // Concatenate the encoded consumer key, a colon character, and the 
      // encoded consumer secret 
      String credentials = urlApiKey + ":" + urlApiSecret; 

      String auth = "Basic " 
        + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 
      headers.put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
      headers.put("Authorization", auth); 
      return headers; 
     } 

     @Override 
     public byte[] getBody() { 
      return requestBody.getBytes(); 
     } 
    }; 
    AppController.getInstance().addToRequestQueue(req1, tag_json_arry); 

} 
+1

Не просто отправляйте код, вам нужно объяснить, как это отвечает на вопрос, который задает ОП, может быть, немного о том, как он работает и т. Д. –

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