Вопрос по twitter, android, twitter-oauth, twitter4j – API Twitter возвращает неверный обратный вызов - не удается авторизоваться

0

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

Я интегрирую 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=*** тогда моя деятельность получит намерение, и все будет хорошо ...

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

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

Ваш Ответ

4   ответа
0

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

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

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;
Нет, это не главное. Совершенно нормально использовать только OAUTH_CALLBACK_SCHEME + & quot;: /// & quot; Bojan Radivojevic Bomber
0
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;

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

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

Я закончил тем, что использовал свой собственный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;
@Afflatus Я добавил, что регистрация должнаOverrideUrlLoading
На самом деле, я думаю, что я переделаю свой код, чтобы использовать что-то вроде этого вместо трансляции Intents ... Это гораздо эффективнее! Если никто не предложит лучшего решения, я приму этот ответ. Bojan Radivojevic Bomber
Это в основном то, что я и сделал (проверил наличие моего URL обратного вызова внутри возвращенного URL и изменил его в соответствии с моим ожидаемым форматом), но есть ли лучший способ? Bojan Radivojevic Bomber
Это определенно лучшее решение, я полностью удалил фильтр намерений! Просто предложение для вас, для извлечения параметров запроса из вашей строки, вы можете использоватьUri uri = Uri.parse(url); String oAuthVerifier = uri.getQueryParameter("oauth_verifier"); if (oAuthVerifier != null) {...} Это выглядит лучше, чем вещь url.substring () ... Спасибо! Bojan Radivojevic Bomber
@ScouseChris Можете ли вы сказать, что вы разместили этот код где?

Похожие вопросы