API Twitter возвращает неверный обратный вызов - не удается авторизоваться

[Решено, но я открыт для новых предложений ...]

Я интегрирую Twitter в свое приложение для Android с помощью twitter4j.

Когда я пытаюсь авторизоваться через Twitter, я вызываю следующую конечную точку с моим токеном oauth:

https://api.twitter.com/oauth/authenticate?oauth_token=MY_VALID_TOKEN

которыйshould перенаправить меня на:

MY-CALLBACK:///?oauth_token=***&oauth_verifier=***

но вместо этого он перенаправляет меня на:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

который, очевидно, не является действительным URL.
(Так же: отсутствует - должно бытьMY-CALLBACK:///...)

Обратите внимание, что я использую WebView для своих звонков


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



Я передаю свой URL обратного вызова

getOAuthRequestToken("MY-CALLBACK:///");

и уже установили фильтр намерений для моей деятельности с

<data android:scheme="x-oauthflow-twitter" />

Также активность имеетandroid:launchMode="singleInstance"



Что я делаю неправильно?


[править: подробнее]

mTwitter = new TwitterFactory().getInstance();
mTwitter.setOAuthConsumer(Constants.TWITTER_CONSUMER_KEY, Constants.TWITTER_CONSUMER_SECRET);

twitterWebView = new WebView(ActivityTwitterAuthorize.this);

twitterWebView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith(Constants.TWITTER_CALLBACK_URL)) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            startActivity(intent);

        // HACKY PART!
        // I added the following code to force it to work, but this is a dirty hack...
        // String TWITTER_CALLBACK_INVALID_PREFIX = "https://api.twitter.comx-oauthflow-twitter///";
        // TWITTER_CALLBACK_URL = "MY-CALLBACK:///";
        // BEGIN
        } else if (url.startsWith(TWITTER_CALLBACK_INVALID_PREFIX)) {
            url = url.substring(TWITTER_CALLBACK_INVALID_PREFIX.length());
            url = Constants.TWITTER_CALLBACK_URL + url;
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            startActivity(intent);
        // END

        } else {
            view.loadUrl(url);
        }
        return true;
    }

});

mTwitterReqToken = mTwitter.getOAuthRequestToken(Constants.TWITTER_CALLBACK_URL);

twitterWebView.loadUrl(mTwitterReqToken.getAuthenticationURL());

БЕЗ хакерской части, этот код приводит к тому, что «веб-страница недоступна» ошибка, потому что URL недействителен:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

Если URL былMY-CALLBACK:///?oauth_token=***&oauth_verifier=*** тогда моя деятельность получит намерение, и все будет хорошо ...

С «хакерской частью» мой код работает, но я бы хотел избежать этого куска кода.

 Bojan Radivojevic Bomber13 июн. 2012 г., 13:57
Я тоже это пробовал, но даже когда набираюhttps://api.twitter.com/oauth/authenticate?oauth_token=MY_VALID_TOKEN в моем браузере API Twitter возвращает неверный URL ...
 Dipak Keshariya13 июн. 2012 г., 13:20
Пожалуйста, дайте более подробную информацию, я не понимаю вашу проблему.
 Vivek Kumar Srivastava13 июн. 2012 г., 13:51
вам нужно закрыть диалог webView после получения условия if (url.startsWith (Constants.TWITTER_CALLBACK_URL)).

Ответы на вопрос(4)

в вашем коде нет ничего плохого. Вчера я получил тот же результат, но сегодня он работает как шарм. Это, вероятно, проблема на стороне сервера. Не могли бы вы попробовать еще раз ваше оригинальное (без хакерской части) решение, пожалуйста?

 Bojan Radivojevic Bomber15 июн. 2012 г., 19:00
Я догадался, что это проблема на стороне сервера. Я включил код для работы с обоими случаями, просто чтобы быть в безопасности. Я пишу, чтобы войти, когда "взломать" часть выполнена, поэтому я проверю это. Я дам вам знать в эти дни ...

public static final String  OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter";
public static final String  OAUTH_CALLBACK_HOST = "callback";
public static final String  CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST;
 Bojan Radivojevic Bomber13 июн. 2012 г., 13:43
Нет, это не главное. Совершенно нормально использовать только OAUTH_CALLBACK_SCHEME + & quot;: /// & quot;
public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter";
public static final String OAUTH_CALLBACK_HOST = "litestcalback";
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME+ "://" +OAUTH_CALLBACK_HOST;

 13 июн. 2012 г., 13:55
Уважаемый, используйте SCHEME: // HOST .... и попробуйте для этого ....
 Bojan Radivojevic Bomber13 июн. 2012 г., 14:08
Я действительно ценю ваши усилия, но это не помогает мне. URL, возвращенный с сервера, просто НЕ начинается с моего обратного вызова URI. Начинается сhttps://api.twitter.com а потом мой обратный звонок
 Bojan Radivojevic Bomber13 июн. 2012 г., 14:00
Я старалсяpublic static final String TWITTER_CALLBACK_URL = "x-oauthflow-twitter:///"; и я тоже попробовалpublic static final String TWITTER_CALLBACK_URL = "x-oauthflow-twitter://callback";, Не имеет значения, это не работает в любом случае ...
 Bojan Radivojevic Bomber13 июн. 2012 г., 13:53
Это третий ответ, который говорит, что мой URL обратного вызова неверен. Нет, мой URL обратного вызова не ошибается. Я уже пробовал это, и то же самое, использую ли я SCHEME: // HOST или просто SCHEME: ///
 13 июн. 2012 г., 14:03
попробуй это дорогой. приватная статическая финальная Uri CALLBACK_URI = Uri.parse (& quot; twifj: // twitterfj & quot;); и в вашем пользовательском WebViewClient if (url.startsWith (CALLBACK_URI.toString ())) {}
Решение Вопроса

что просто не могу заставить его работать таким образом, следуя инструкциям, которые я видел в Интернете.

Я закончил тем, что использовал свой собственныйWebViewClient с кодом:

if ( url.contains( "MY-CALLBACK:///" ) )
{
    final int start = url.indexOf( '?' ) + 1;
    final String params = url.substring( start );
    final String verifierToken = "oauth_verifier=";
    if ( params.contains( verifierToken ) )
    {
        final int value = params.indexOf( verifierToken ) + verifierToken.length();
        final String token = params.substring( value );
        view.stopLoading();                  
        authoriseNewUser( token );
    }
    else if ( params.contains( "denied" ) )
    {
        view.stopLoading();
        finish();
    }
}
else
{
    view.loadUrl( url );
}
return true;
 13 окт. 2015 г., 13:55
@Afflatus Я добавил, что регистрация должнаOverrideUrlLoading
 Bojan Radivojevic Bomber13 июн. 2012 г., 14:03
На самом деле, я думаю, что я переделаю свой код, чтобы использовать что-то вроде этого вместо трансляции Intents ... Это гораздо эффективнее! Если никто не предложит лучшего решения, я приму этот ответ.
 Bojan Radivojevic Bomber13 июн. 2012 г., 13:39
Это в основном то, что я и сделал (проверил наличие моего URL обратного вызова внутри возвращенного URL и изменил его в соответствии с моим ожидаемым форматом), но есть ли лучший способ?
 Bojan Radivojevic Bomber13 июн. 2012 г., 14:40
Это определенно лучшее решение, я полностью удалил фильтр намерений! Просто предложение для вас, для извлечения параметров запроса из вашей строки, вы можете использоватьUri uri = Uri.parse(url); String oAuthVerifier = uri.getQueryParameter("oauth_verifier"); if (oAuthVerifier != null) {...} Это выглядит лучше, чем вещь url.substring () ... Спасибо!
 11 окт. 2015 г., 06:06
@ScouseChris Можете ли вы сказать, что вы разместили этот код где?

Ваш ответ на вопрос