簡體   English   中英

使用Android和Twitter4J的持久OAuth

[英]Persistent OAuth using Android and Twitter4J

因此,我正在嘗試使用Twitter4J庫來了解適用於Twitter的OAuth

我會提供一些背景知識。

我在AndroidManifest.xml使用Browser方法和回調(已將其設置為意圖過濾器)設置了Twitter開發人員帳戶。

我有一個活動可以完全處理我的Twitter身份驗證。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //set up the datahelper
    dh = new DataHelper(this, null);
    tae = dh.GetAuthenticationObject();
    setContentView(R.layout.main);
}

@Override
protected void onResume() {
    super.onResume();
    selectOption(getIntent());
}

public void selectOption(Intent intent) {
    Uri uri = intent.getData();
    if (uri != null && uri.toString().startsWith(CALLBACKURL) && tae.hasBeenAuthenticatedTwitter()) {           
        completeAuth(intent);           
    } else {
        doOauth();
    }
}

private void doOauth() {
    try {
        consumer = new CommonsHttpOAuthConsumer(Enums.TWITTER_APPLICATION_KEY,
                Enums.TWITTER_APPLICATION_SECTRET);

        provider = new DefaultOAuthProvider(
                Enums.TWITTER_REQUEST_TOKEN_URL,
                Enums.TWITTER_ACCESS_TOKEN_URL,
                Enums.TWITTER_AUTHORIZE_URL);

        String authUrl = provider.retrieveRequestToken(
                consumer, CALLBACKURL);

        tae.TwitterToken =  consumer.getToken();
        tae.TwitterTokenSecret = consumer.getTokenSecret();
        dh.SaveAuthenticationObject(tae);

        this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                .parse(authUrl)));
    } catch (Exception e) {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

/**
 * After use authorizes this is the function where we get back callbac with
 * user specific token and secret token. You might want to store this token
 * for future use.
 */

public void completeAuth(Intent intent) {
    Uri uri = intent.getData();
    if (uri != null && uri.toString().startsWith(CALLBACKURL)) {

        tae = dh.GetAuthenticationObject();
        String verifier = uri
                .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
        tae.TwitterVerifier = verifier;
        dh.SaveAuthenticationObject(tae);   
    }

    Intent settingsIntent = new Intent(this, com.undetowdevelopment.kontakt.Settings.class);
    settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    settingsIntent.putExtra("REQUEST_CODE", Enums.REQUEST_CODE_TWITTER_LOGIN);
    settingsIntent.putExtra("RESULT_CODE", Activity.RESULT_OK);
    startActivity(settingsIntent);  
}

這堂課完全符合我的期望。 它打開Twitter身份驗證頁面,返回到活動,然后將Token & Secret保存到共享首選項中。

我的AndroidManifest.xml看起來像:

    <activity android:name=".TwitterSuccess" android:label="@string/app_name" android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"></action>
            <category android:name="android.intent.category.DEFAULT"></category>
            <category android:name="android.intent.category.BROWSABLE"></category>
            <data android:scheme="myapp" android:host="mainactivity"/>
        </intent-filter>
    </activity>

但是,當我的應用程序啟動時,我想檢查此人是否已通過身份驗證,而不必一直要求用戶再次進行身份驗證。

從我所有的活動中,我都有一個方法返回一個Twitter對象,我想使用該對象來設置狀態或獲取用戶的朋友。

我使用以下方法執行此操作:

public Twitter getTwitterObject()
{

    AuthenticationEntity ae = GetAuthenticationObject();

    CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(Enums.TWITTER_APPLICATION_KEY, Enums.TWITTER_APPLICATION_SECTRET); 
    //Set the requestToken and the tokenSecret that you got earlier by calling retrieveRequestToken.
    consumer.setTokenWithSecret(ae.TwitterToken, ae.TwitterTokenSecret);

    //The provider object is lost, too, so instantiate it again.
    DefaultOAuthProvider provider = new DefaultOAuthProvider(
            Enums.TWITTER_REQUEST_TOKEN_URL,
            Enums.TWITTER_ACCESS_TOKEN_URL,
            Enums.TWITTER_AUTHORIZE_URL);

    //Now that's really important. Because you don't perform the retrieveRequestToken method at this moment, the OAuth method is not detected automatically (there is no communication with Twitter). So, the default is 1.0 which is wrong because the initial request was performed with 1.0a.
    provider.setOAuth10a(true);


    try {
        provider.retrieveAccessToken(consumer, ae.TwitterVerifier);
    } catch (Exception e) {
        Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

    Twitter twitter = new TwitterFactory().getInstance();
    twitter.setOAuthConsumer(Enums.TWITTER_APPLICATION_KEY, Enums.TWITTER_APPLICATION_SECTRET);
    twitter.setOAuthAccessToken(new AccessToken(consumer.getToken(), consumer.getTokenSecret()));
    return twitter;

}

現在,如果用戶剛剛登錄,此方法就可以正常工作,但是如果我再次啟動該應用程序(這沒​​關系,因為我僅使用靜態變量和Shared Preferences中的數據),則無法進行身份驗證,並得到以下異常:

01-24 11:41:54.075: WARN/System.err(14612): oauth.signpost.exception.OAuthCommunicationException: Communication with the service provider failed: http://twitter.com/oauth/access_token
01-24 11:41:54.075: WARN/System.err(14612):     at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:214)
01-24 11:41:54.075: WARN/System.err(14612):     at oauth.signpost.AbstractOAuthProvider.retrieveAccessToken(AbstractOAuthProvider.java:97)
01-24 11:41:54.075: WARN/System.err(14612):     at com.undetowdevelopment.kontakt.helpers.DataHelper.getTwitterObject(DataHelper.java:129)
01-24 11:41:54.075: WARN/System.err(14612):     at com.undetowdevelopment.kontakt.Settings.checkTwitterStatus(Settings.java:118)
01-24 11:41:54.075: WARN/System.err(14612):     at com.undetowdevelopment.kontakt.Settings.setUIComponents(Settings.java:60)
01-24 11:41:54.075: WARN/System.err(14612):     at com.undetowdevelopment.kontakt.Settings.onCreate(Settings.java:39)
01-24 11:41:54.075: WARN/System.err(14612):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
01-24 11:41:54.085: WARN/System.err(14612):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
01-24 11:41:54.085: WARN/System.err(14612):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
01-24 11:41:54.085: WARN/System.err(14612):     at android.app.ActivityThread.access$2300(ActivityThread.java:135)
01-24 11:41:54.085: WARN/System.err(14612):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
01-24 11:41:54.085: WARN/System.err(14612):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-24 11:41:54.085: WARN/System.err(14612):     at android.os.Looper.loop(Looper.java:144)
01-24 11:41:54.085: WARN/System.err(14612):     at android.app.ActivityThread.main(ActivityThread.java:4937)
01-24 11:41:54.085: WARN/System.err(14612):     at java.lang.reflect.Method.invokeNative(Native Method)
01-24 11:41:54.085: WARN/System.err(14612):     at java.lang.reflect.Method.invoke(Method.java:521)
01-24 11:41:54.085: WARN/System.err(14612):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-24 11:41:54.085: WARN/System.err(14612):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-24 11:41:54.085: WARN/System.err(14612):     at dalvik.system.NativeStart.main(Native Method)
01-24 11:41:54.085: WARN/System.err(14612): Caused by: java.io.FileNotFoundException: http://twitter.com/oauth/access_token
01-24 11:41:54.085: WARN/System.err(14612):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1162)
01-24 11:41:54.085: WARN/System.err(14612):     at oauth.signpost.basic.HttpURLConnectionResponseAdapter.getContent(HttpURLConnectionResponseAdapter.java:18)
01-24 11:41:54.085: WARN/System.err(14612):     at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:228)
01-24 11:41:54.085: WARN/System.err(14612):     at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:189)
01-24 11:41:54.085: WARN/System.err(14612):     ... 18 more
01-24 11:41:54.885: WARN/System.err(14612): http://api.twitter.com/1/account/verify_credentials.json?include_entities=falseRelevant discussions can be on the Internet at:
01-24 11:41:54.885: WARN/System.err(14612):     http://www.google.co.jp/search?q=2486d84d or
01-24 11:41:54.885: WARN/System.err(14612):     http://www.google.co.jp/search?q=0d00203c
01-24 11:41:54.885: WARN/System.err(14612): TwitterException{exceptionCode=[2486d84d-0d00203c 175a68e8-9303e317], statusCode=-1, retryAfter=0, rateLimitStatus=null, version=2.1.12-SNAPSHOT(build: e7bec3eec13cedc774926ee24f4c5368d218c9d4)}
01-24 11:41:54.885: WARN/System.err(14612):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:214)
01-24 11:41:54.885: WARN/System.err(14612):     at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:75)
01-24 11:41:54.885: WARN/System.err(14612):     at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:103)
01-24 11:41:54.885: WARN/System.err(14612):     at twitter4j.Twitter.verifyCredentials(Twitter.java:1397)
01-24 11:41:54.885: WARN/System.err(14612):     at twitter4j.Twitter.getScreenName(Twitter.java:191)
01-24 11:41:54.885: WARN/System.err(14612):     at com.undetowdevelopment.kontakt.Settings.checkTwitterStatus(Settings.java:120)
01-24 11:41:54.885: WARN/System.err(14612):     at com.undetowdevelopment.kontakt.Settings.setUIComponents(Settings.java:60)
01-24 11:41:54.885: WARN/System.err(14612):     at com.undetowdevelopment.kontakt.Settings.onCreate(Settings.java:39)
01-24 11:41:54.885: WARN/System.err(14612):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
01-24 11:41:54.885: WARN/System.err(14612):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
01-24 11:41:54.885: WARN/System.err(14612):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
01-24 11:41:54.885: WARN/System.err(14612):     at android.app.ActivityThread.access$2300(ActivityThread.java:135)
01-24 11:41:54.885: WARN/System.err(14612):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
01-24 11:41:54.885: WARN/System.err(14612):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-24 11:41:54.885: WARN/System.err(14612):     at android.os.Looper.loop(Looper.java:144)
01-24 11:41:54.885: WARN/System.err(14612):     at android.app.ActivityThread.main(ActivityThread.java:4937)
01-24 11:41:54.885: WARN/System.err(14612):     at java.lang.reflect.Method.invokeNative(Native Method)
01-24 11:41:54.885: WARN/System.err(14612):     at java.lang.reflect.Method.invoke(Method.java:521)
01-24 11:41:54.885: WARN/System.err(14612):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-24 11:41:54.885: WARN/System.err(14612):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-24 11:41:54.885: WARN/System.err(14612):     at dalvik.system.NativeStart.main(Native Method)
01-24 11:41:54.885: WARN/System.err(14612): Caused by: java.io.FileNotFoundException: http://api.twitter.com/1/account/verify_credentials.json?include_entities=false
01-24 11:41:54.885: WARN/System.err(14612):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1162)
01-24 11:41:54.885: WARN/System.err(14612):     at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:47)
01-24 11:41:54.895: WARN/System.err(14612):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:178)
01-24 11:41:54.895: WARN/System.err(14612):     ... 20 more
01-24 11:41:54.995: WARN/InputManagerService(99): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@46113ee8 (uid=10060 pid=14093)

就像我提到的那樣,當我剛完成身份驗證時,一切正常,但是如果再次啟動應用程序,則會收到此消息。

我正在使用運行Android 2.2的HTC Incredible 該應用程序正在針對Android 1.6+開發。

任何意見或幫助將不勝感激!

最好,

伊格努斯

我不確定自己在做什么,但是可以看看Zwitscher https://github.com/pilhuhn/ZwitscherA ,尤其是https://github.com/pilhuhn/ZwitscherA/blob/v065/src /de/bsd/zwitscher/LoginActivity.java方法,然后調用TwitterHelper。

當用戶首次登錄並且從未登錄時,活動將對此進行檢查並顯示帶有“ getPinFromTwitter”按鈕的屏幕-這會將用戶重定向到他可以登錄並獲取密碼的Twitter。 用戶再次啟動該應用程序,輸入圖釘並單擊“ setPin”。 在此版本的Zwitscher中,帳戶存儲在數據庫中。 在早期版本中(只需查看v065標簽即可,例如: https : //github.com/pilhuhn/ZwitscherA/tree/v065 ),這是通過共享首選項完成的。 目前,源頭的流量有所增加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM