首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SignPost在安卓系统中的Tumblr登录

SignPost在安卓系统中的Tumblr登录
EN

Stack Overflow用户
提问于 2014-04-02 11:38:17
回答 2查看 1.4K关注 0票数 1

我正试图在我的安卓应用程序中实现一个tumblr登录,方法是遵循以下示例:https://github.com/jansanz/TumblrOAuthDemo

我可以得到请求令牌。但是当我试图检索AccessToken时,它给了我一个例外。以下是代码:

代码语言:javascript
复制
public class TumblrDemoActivity extends Activity {

private static final String TAG = "TumblrDemo";

private static final String PREFS = "prefs_tumblr";
private static final String PREF_TOKEN = "pref_token_tumblr";
private static final String PREF_TOKEN_SECRET = "pref_token_secret_tumblr";

private static final String REQUEST_TOKEN_URL = "http://www.tumblr.com/oauth/request_token";
private static final String ACCESS_TOKEN_URL = "http://www.tumblr.com/oauth/access_token";
private static final String AUTH_URL = "http://www.tumblr.com/oauth/authorize";

// Taken from Tumblr app registration
private static final String CONSUMER_KEY = "consumer key from tumblr app";
private static final String CONSUMER_SECRET = "consumer secret from tumblr app";

private static final String CALLBACK_URL = "tumblrdemo://www.android-ios-tutorials.com";//"tumblrdemo://tumblrdemo.com/ok";

CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); 
CommonsHttpOAuthProvider provider = new CommonsHttpOAuthProvider(
        REQUEST_TOKEN_URL,
        ACCESS_TOKEN_URL,
        AUTH_URL);

SharedPreferences prefs;

String token;
String tokenSecret;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    prefs = getSharedPreferences(PREFS, Context.MODE_PRIVATE);
    consumer.setMessageSigner(new HmacSha1MessageSigner());
    // It uses this signature by default
    // consumer.setMessageSigner(new HmacSha1MessageSigner());

    // To get the oauth token after the user has granted permissions
    Uri uri = this.getIntent().getData();
    if (uri != null) {

        Log.d(TAG, "accessToken       : "+consumer.getToken());
        Log.d(TAG, "accessTokenSecret : "+consumer.getTokenSecret());

        //retrieve token and tokenSecret saved in retrieveRequestToken() call
        this.token = prefs.getString(PREF_TOKEN, null);
        this.tokenSecret = prefs.getString(PREF_TOKEN_SECRET, null);
        Log.d(TAG, "this.token       : "+token);
        Log.d(TAG, "this.tokenSecret : "+tokenSecret);

        consumer.setTokenWithSecret(token, tokenSecret);

        Log.d(TAG, "consumer.token       : "+consumer.getToken());
        Log.d(TAG, "consumer.tokenSecret : "+consumer.getTokenSecret());

        String token = uri.getQueryParameter("oauth_token");
        String verifier = uri.getQueryParameter("oauth_verifier");

        Log.v(TAG, "Token:" +token);
        Log.v(TAG, "Verifier:" +verifier);

        try {
            provider.retrieveAccessToken(consumer, verifier);
            Log.d(TAG, "accessToken       retrieveAccessToken    : "+consumer.getToken());
            Log.d(TAG, "accessTokenSecret retrieveAccessToken    : "+consumer.getTokenSecret());

        } catch (OAuthMessageSignerException e) {
            e.printStackTrace();
        } catch (OAuthNotAuthorizedException e) {
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            e.printStackTrace();
        }
    } else {
        String authUrl;
        try {
            authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
            Log.v(TAG, "Auth url:" + authUrl);
            Log.d(TAG, "accessToken       : "+consumer.getToken());
            Log.d(TAG, "accessTokenSecret : "+consumer.getTokenSecret());

            //save tokens in preferences
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString(PREF_TOKEN, consumer.getToken());
            editor.putString(PREF_TOKEN_SECRET, consumer.getTokenSecret());
            editor.commit();

            startActivity(new Intent("android.intent.action.VIEW", Uri.parse(authUrl)));

        } catch (OAuthMessageSignerException e) {
            e.printStackTrace();
        } catch (OAuthNotAuthorizedException e) {
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            e.printStackTrace();
        }
    }
}

@Override
protected void onResume() {
    super.onResume();
    Log.v(TAG, "onResume");
}

}

provider.retrieveRequestToken()的第一个调用是可以的。我可以检索令牌和tokenSecret。但是,当我试图通过调用accessToken获得provider.retrieveAccessToken(consumer,oauth_verifier);时,我得到了一个OAuthCommunicationException,OAuthCommunicationException的堆栈跟踪是:

代码语言:javascript
复制
    04-02 11:34:14.735: W/System.err(19535): oauth.signpost.exception.OAuthCommunicationException: Communication with the service provider failed: Service provider responded in error: 400 (Bad Request)
04-02 11:34:14.735: W/System.err(19535):    at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:218)
04-02 11:34:14.735: W/System.err(19535):    at oauth.signpost.AbstractOAuthProvider.retrieveAccessToken(AbstractOAuthProvider.java:108)
04-02 11:34:14.735: W/System.err(19535):    at org.jfsd.tumblrdemo.TumblrDemoActivity.onCreate(TumblrDemoActivity.java:87)
04-02 11:34:14.735: W/System.err(19535):    at android.app.Activity.performCreate(Activity.java:5066)
04-02 11:34:14.745: W/System.err(19535):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102)
04-02 11:34:14.745: W/System.err(19535):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288)
04-02 11:34:14.745: W/System.err(19535):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)
04-02 11:34:14.745: W/System.err(19535):    at android.app.ActivityThread.access$600(ActivityThread.java:151)
04-02 11:34:14.745: W/System.err(19535):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1330)
04-02 11:34:14.745: W/System.err(19535):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-02 11:34:14.755: W/System.err(19535):    at android.os.Looper.loop(Looper.java:155)
04-02 11:34:14.755: W/System.err(19535):    at android.app.ActivityThread.main(ActivityThread.java:5536)
04-02 11:34:14.755: W/System.err(19535):    at java.lang.reflect.Method.invokeNative(Native Method)
04-02 11:34:14.755: W/System.err(19535):    at java.lang.reflect.Method.invoke(Method.java:511)
04-02 11:34:14.755: W/System.err(19535):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074)
04-02 11:34:14.755: W/System.err(19535):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841)
04-02 11:34:14.755: W/System.err(19535):    at dalvik.system.NativeStart.main(Native Method)
04-02 11:34:14.765: W/System.err(19535): Caused by: oauth.signpost.exception.OAuthCommunicationException: Service provider responded in error: 400 (Bad Request)
04-02 11:34:14.765: W/System.err(19535):    at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:245)
04-02 11:34:14.765: W/System.err(19535):    at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:193)
04-02 11:34:14.765: W/System.err(19535):    ... 16 more

任何帮助都会被接受。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-08 21:50:42

我已经为Tumblr Login创建了一个小型库,使用oauth标志柱和大型for。你可以在这里找到它:

使用oauth标志柱的Tumblr登录API

我希望这个图书馆能对其他有同样问题的人有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-03-16 09:51:39

我知道这是一个相当古老的线索。但对于任何晚来的人来说..。我构建了一个库来实现登录过程的自动化。另外,这个链接被破坏了。可能想要更新一下。

它可以在Github上使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22810226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档