OAuth + Twitter на Android: обратный вызов не работает - PullRequest
8 голосов
/ 04 февраля 2010

Мое приложение Android использует библиотеку Java OAuth, найдено здесь для авторизации в Twitter.Я могу получить токен запроса, авторизовать токен и получить подтверждение, но когда браузер пытается выполнить URL-адрес обратного вызова для повторного подключения к моему приложению, он не использует URL-адрес, который я предоставляю в коде, но использует тот, который я указал при регистрациис Twitter.

Примечание:
1. При регистрации приложения в Twitter я предоставил гипотетический URL обратного вызова: http://abz.xyc.com и установил тип приложения в качестве браузера.
2.Я предоставил URL обратного вызова в своем коде «myapp» и добавил фильтр намерений для своей деятельности с категорией и схемой данных Browsable как «myapp».
3. URL, вызываемый при авторизации, содержит URL обратного вызова, указанный в коде.

Есть идеи, что я здесь не так делаю?

Соответствующий код:

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

        OAuthAccessor client = defaultClient();
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(client.consumer.serviceProvider.userAuthorizationURL + "?oauth_token="
                + client.requestToken + "&oauth_callback=" + client.consumer.callbackURL));

        startActivity(i);

    }

    OAuthServiceProvider defaultProvider()
    {
        return new OAuthServiceProvider(GeneralRuntimeConstants.request_token_URL,
                GeneralRuntimeConstants.authorize_url, GeneralRuntimeConstants.access_token_url);
    }

    OAuthAccessor defaultClient()
    {
        String callbackUrl = "myapp:///";
        OAuthServiceProvider provider = defaultProvider();
        OAuthConsumer consumer = new OAuthConsumer(callbackUrl,
                GeneralRuntimeConstants.consumer_key, GeneralRuntimeConstants.consumer_secret,
                provider);
        OAuthAccessor accessor = new OAuthAccessor(consumer);

        OAuthClient client = new OAuthClient(new HttpClient4());
        try
        {
            client.getRequestToken(accessor);
        } catch (Exception e)
        {
            e.printStackTrace();
        }

        return accessor;
    }

    @Override
    protected void onResume()
    {
        // TODO Auto-generated method stub
        super.onResume();

        Uri uri = this.getIntent().getData();
        if (uri != null)
        {
            String access_token = uri.getQueryParameter("oauth_token");
        }
    }

}
// Manifest file
 <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".FirstActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
             <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="myapp"/>
            </intent-filter>
        </activity>
 </application>

Ответы [ 4 ]

11 голосов
/ 08 марта 2010

Twitter не учитывает обратные вызовы, запрошенные в запросах OAuth ( Twitter API Announce ), и будет перенаправлять только на URL обратного вызова, указанный в настройках приложения (обратите внимание, что «localhost» не разрешен).

Полагаю, вы проверили Oauth-callback-on-android вопрос.

догадки Android -
После небольшого прочтения я вижуБраузер Android перенаправляет MyApp: /// в ваше приложение, и я предполагаю, что Twitter не нравится этот специальный префикс URI.Я не Android-разработчик, но одно предложение, которое я мог бы сделать, это получить "www.myapp.com" в Интернете и перенаправить туда.

Итак, верните свой OAuth на http://www.myapp.com/redirect.aspx?oauth_token=abc и перенаправьте страницу на myapp:///oauth_token=... (желаемый результат)

3 голосов
/ 23 августа 2011

В моем случае у меня это работает:

 String authURL = m_provider.retrieveRequestToken (m_consumer, CALLBACK_URL);

А в Манифесте:

    <activity android:configChanges = "keyboardHidden|orientation" android:name = "xxxx.android.xxxxx"> 
        <intent-filter>
            <action android:name   = "android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="myapp" android:host="tweet" />
        </intent-filter>

В этом случае URL обратного вызова будет: myapp: // tweet

0 голосов
/ 13 февраля 2013

Моя проблема заключалась в том, что я пытался войти в систему с той же учетной записью, что и в приложении Twitter.После того, как я вошел в систему с моим личным профилем, перезвонил (пока).

0 голосов
/ 04 февраля 2010

Мне кажется, что вы делаете все правильно, и Twitter все портит, всегда принимая ваш зарегистрированный URL обратного вызова.Есть ли способ изменить зарегистрированный URL?Может быть, в следующий раз вы сможете заново зарегистрироваться и попробовать обратный вызов Android, посмотрите, что получится.

...