использование RoboSpice для получения токена Bearer из API Twitter (аутентификация только приложения) 1.1 возвращает несанкционированный

это первый раз, когда я отправляю сообщение в stackOverflow, я хочу получить токен носителя из твиттера с помощью oauth2 (аутентификация только приложения) и следовал инструкциям из здесь, но мой код возвращает ошибку 401 неавторизованный

вот мой код:

package com.example.twitterapp;

import java.net.URLEncoder;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;

import android.util.Base64;
import android.util.Log;

import com.octo.android.robospice.request.springandroid.SpringAndroidSpiceRequest;

public class BearerTokenJsonRequest extends
        SpringAndroidSpiceRequest<BearerToken> {


    String API_STRING;



    @Override
    public BearerToken loadDataFromNetwork() throws Exception {
        try{
            API_STRING = URLEncoder.encode("xvz1evFS4wEEPTGEFPHBog","UTF-8")+  
                ":"+URLEncoder.encode("L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg","UTF-8");
            Log.d("JSON" , "apistring: "+ API_STRING);
            }catch(Exception e){
                e.printStackTrace();
            }

        String encodedString = Base64.encodeToString(API_STRING.getBytes("UTF-8"), Base64.DEFAULT);
                Log.d("ENCODED" , "Base64: "+ encodedString);       




        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic " + encodedString); 
        headers.add("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 



        ResponseEntity<BearerToken> entity= getRestTemplate().exchange(
                "https://api.twitter.com/oauth2/token?grant_type=client_credentials", 
                HttpMethod.POST, new HttpEntity<Object>(headers), BearerToken.class);

        return entity.getBody();


    }

}

этот код возвращает ошибку 401 неавторизованный. Я убедился, что потребительский ключ и секрет верны, попробовал кодировать URL-адрес строки в кодировке Base64.

это моя ошибка logcat:

09-20 13:21:23.190: W/RestTemplate(16646): POST request for
"https://api.twitter.com/oauth2/token?grant_type=client_credentials"
resulted in 401 (Unauthorized); invoking error handler 09-20
13:21:23.210: E//RequestRunner.java:134(16646): 13:21:23.222
Thread-25757 An exception occurred during request network execution
:401 Unauthorized 09-20 13:21:23.210:
E//RequestRunner.java:134(16646):
org.springframework.web.client.HttpClientErrorException: 401
Unauthorized 09-20 13:21:23.210: E//RequestRunner.java:134(16646):
    at
org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:76)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:524)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:481)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:415)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
com.example.twitterapp.BearerTokenJsonRequest.loadDataFromNetwork(BearerTokenJsonRequest.java:83)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
com.example.twitterapp.BearerTokenJsonRequest.loadDataFromNetwork(BearerTokenJsonRequest.java:1)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:45)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
com.octo.android.robospice.request.RequestRunner.processRequest(RequestRunner.java:130)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
com.octo.android.robospice.request.RequestRunner$1.run(RequestRunner.java:197)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
java.util.concurrent.FutureTask.run(FutureTask.java:137) 09-20
13:21:23.210: E//RequestRunner.java:134(16646):     at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-20 13:21:23.210: E//RequestRunner.java:134(16646):   at
java.lang.Thread.run(Thread.java:856)

пожалуйста, помогите, я застрял в этой проблеме три дня :/

вот мой лог для апистринга

09-23 16:10:46.209: D/JSON(29263): apistring: xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg

и для строки в кодировке base64

09-23 16:10:52.329: D/ENCODED(29263): Base64:       eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4
09-23 16:10:52.329: D/ENCODED(29263): OERSZHlPZw== //idk why it shows my log in 2 lines

person Martin Pesevski    schedule 20.09.2013    source источник


Ответы (1)


Не могли бы вы заменить MyClientKey и MyClientSecret на примеры, предоставленные твиттером и убедиться, что базовая аутентификация, которую вы отправляете по почте, является правильной?

Пожалуйста, замените их и покажите логи, чтобы было понятно, что вы получили именно ту форму, которую требует твитер.

Обратите внимание: после этого вы должны изолировать код для генерации отправляемого вами токена и использовать примеры твиттера для тестирования этого кода в модульном тесте.

person Snicolas    schedule 23.09.2013
comment
попробовал с ключом клиента и секретом клиента, указанными в примере твиттера, все та же ошибка, также отредактировал мой пост, чтобы вы могли видеть журналы сейчас - person Martin Pesevski; 23.09.2013
comment
также я новичок в разработке Android, поэтому я не знаю, как использовать модульный тест, но я посмотрю на это, спасибо - person Martin Pesevski; 23.09.2013
comment
Я думаю, что проблема связана с grant_type=client_credentials. Это должно быть в теле вашего запроса, а не в URL-адресе. Это пост. - person Snicolas; 23.09.2013