Получение 401 при запросе токена доступа с указателем в Android - PullRequest
4 голосов
/ 27 марта 2011

Вот мой код, я продолжаю получать исключение «Авторизация не удалась (сервер ответил 401). Это может произойти, если ключ потребителя был неверен или подписи не совпадали». в этой строке 'provider.retrieveAccessToken (потребитель, верификатор);'. Я трижды проверил мой ключ и секретный ключ пользователя, и мое твиттер-приложение настроено как браузер, и попытался установить provider.setOAuth10a (true), я боролся с этим в течение 2 дней !! Я использую указатель 1.2.1.1 (core & commonshttp4), если кто-нибудь может помочь! Пожалуйста, я в отчаянии

    private static final String CONSUMER_KEY = "MY_CONSUMER_KEY";
    private static final String CONSUMER_SECRET = "MY_CONSUMER_SECRET";

    private static final String CALLBACK_URL = "tweet-mapper://mainactivity";

    private static final String REQUEST_URL = "https://api.twitter.com/oauth/request_token";
    private static final String ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token";
    private static final String AUTH_URL = "https://api.twitter.com/oauth/authorize";

    private static final String PREFERENCE_FILE = "twitter_oauth.prefs";

    private static CommonsHttpOAuthConsumer consumer;
    private static CommonsHttpOAuthProvider provider;

    private static String ACCESS_KEY;
    private static String ACCESS_SECRET;

    private Twitter twitter;


    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        loginViaOAuth();

    }

    private void loginViaOAuth() {
        try {
            consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
            provider.setOAuth10a(true);
            provider = new CommonsHttpOAuthProvider(REQUEST_URL, ACCESS_TOKEN_URL, AUTH_URL);
            String authURL = provider.retrieveRequestToken(consumer, CALLBACK_URL);
            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authURL)));
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onResume() {

        super.onResume();

        Uri uri = this.getIntent().getData();
        if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
            String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
            Log.d("verifier:", verifier);
            try {

                provider.setOAuth10a(true);
                provider.retrieveAccessToken(consumer, verifier);
                ACCESS_KEY = consumer.getToken();
                ACCESS_SECRET = consumer.getTokenSecret();

                AccessToken a = new AccessToken(ACCESS_KEY, ACCESS_SECRET);

                // initialize Twitter4J
                twitter = new Twitter();
                twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
                twitter.setOAuthAccessToken(a);
                String tweet = "#OAuth working via android app!";

                twitter.updateStatus(tweet);
                Toast.makeText(this, tweet, Toast.LENGTH_LONG).show();

            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Только что нашел возможное решение: вам нужно установить URL обратного вызова в вашей учетной записи приложения Twitter.

0 голосов
/ 24 июля 2012

Проверьте ваш запрос API, это должен быть .json или .xml, что-то вроде https://api.jabbakam.com/network/get_list.json или http://api.twitter.com/1/account/verify_credentials.xml

Я советую вам использовать библиотеку Scribe, для использования Twitter есть встроенный классAPI.

https://github.com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/examples/TwitterExample.java

При создании ключей в твиттере вы установили уровень доступа: чтение и запись?

0 голосов
/ 04 апреля 2011

У меня была точно такая же проблема в моем приложении для Android. Еще более расстраивало то, что мой логин в твиттере отлично работал и начинал сбоить в подписи по некоторым случайным причинам.

Я провел много тестов и обнаружил, что проблема возникла в браузере Android, который используется в процессе OAuth:

  • если вы входите в систему с сохраненным логином / паролем или если у вас есть cookie-файл с вашим сеансом в Твиттере, и вам просто нужно нажать «Принять», он заполнится с ошибкой 401
  • если вы вручную удалите и повторно введете свой пароль, то это сработает!

Я до сих пор не могу понять, как это влияет на вызов API, но я предполагаю, что в браузере наблюдается некоторая путаница при отправке формы «принять» с предварительно введенной информацией.

Мне было бы очень любопытно посмотреть, решит ли мой обходной путь и вашу проблему. Я понимаю, что это неправильное решение, но это только начало.

РЕДАКТИРОВАТЬ: используйте http: // вместо https: // для URL-адресов Twitter OAuth, и это решает проблему. Я до сих пор не понимаю, что происходит ...

...