安卓Tumblr oAuth混淆

6

我正在尝试在Android应用程序中实现Tumblr API。我遇到的问题是如何授权用户,以便他们可以发布和查看其仪表板等操作。我对oAuth不是很了解,而Tumblr API文档似乎跳过了它。我不知道是否应提示用户输入凭据,或者获得凭证后该怎么做,或者其他任何信息。我将Signpost库添加到了我的项目中,但是从那时起一直困扰着我。有没有熟悉Android上的oAuth的人能够帮助我?谢谢!


请查看此教程:http://www.android-ios-tutorials.com/920/tumblr-login-using-sign-post/ - Houcine
2个回答

13

文档并不是很好。你应该首先了解OAuth,Twitter 有一个很好的概述。

首先,你需要一个Consumer Key和Consumer Secret(你可以通过在Tumblr中注册你的应用程序来获取这些)。之后,你应该使用Tumblr提供的授权URL从用户那里获取授权。通常,您将生成一个请求URL,然后将用户带到浏览器,在那里他/她将登录并授权您的应用程序。这将触发回调到您的应用程序,您将能够获得oAuth令牌。将其保存在您的应用程序中(SharedPreferences)以便您不需要再次要求用户进行身份验证。使用此令牌,您将能够与需要身份验证的Tumblr API进行交互。

请注意,您还可以实现Webview,而不是让用户使用浏览器。但是,这需要更多的工作。

我发现最新的Signpost库与Tumblr不兼容。你需要稍旧版本。前往 这里 并下载以下文件:

将这两个库导入到你的项目中。要使用它们,基本上只需要调用以下代码:

CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY,
         CONSUMER_SECRET);
CommonsHttpOAuthProvider provider = new CommonsHttpOAuthProvider(
         REQUEST_TOKEN_URL,
         ACCESS_TOKEN_URL,
         AUTH_URL);
String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL); 

CALLBACK_URL可以设置为类似于"tumblrapp://tumblrapp.com/ok"的内容。在Tumblr设置中没有必要设置回调URL。

此外,您需要设置一个意图过滤器,以便在授权后调用您的应用程序。确保您的清单文件如下所示:

            <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="tumblrapp"/>
            </intent-filter>

现在,在身份验证之后,您可以像这样获取令牌:

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

我做了一个快速示例应用程序。你可以在这里查看。由于它会阻塞UI,所以你可能需要将请求移动到后台线程。


@JanS:嗨,Jans,这篇文章非常有帮助。示例代码运行良好。现在我想在单击按钮时清除我的旧凭据(类似于注销功能)。我该怎么做? - Aerrow
我已经下载了这个示例,即"github.com/jansanz/TumblrOAuthDemo",并替换了消费者密钥和消费者密钥。但是当我运行此应用程序时,我遇到了以下错误:java.lang.NoClassDefFoundError: oauth.signpost.commonshttp.CommonsHttpOAuthConsumer。请有人帮帮我。 - rams
您好,我使用您的示例代码获取oauth_tokenoauth_verifier没有问题。但是请问如何将它们转换为oauth_tokenoauth_token_secret - Chor Wai Chun
示例代码很好,但您能否回答我的问题http://stackoverflow.com/questions/21739014/upload-image-from-sd-card-on-tumbler-in-android。我想在tumblr上发布图片。 - Akanksha Rathore
@venkat:请查看此教程:http://www.android-ios-tutorials.com/920/tumblr-login-using-sign-post/ - Houcine
显示剩余10条评论

3
为了方便新手实施,有一个在Github上的Android库Loglr可以替用户登录并返回Token,使其能够与Jumblr库一起使用。
编辑1:
根据Bhargav Raotttony的建议,在此解释Tumblr登录过程,如果你喜欢亲自动手,可以尝试以下步骤。关于OAuth的信息,请参考这篇简化指南 1) 使用signpost库中的httpOAuthprovider生成请求令牌。
            //Generate a new oAuthConsumer object
            commonsHttpOAuthConsumer
                    = new CommonsHttpOAuthConsumer(
                    "Consumer Key",
                    "Consumer Secret Key");
            //Generate a new oAuthProvider object
            commonsHttpOAuthProvider
                    = new CommonsHttpOAuthProvider(
                    "https://www.tumblr.com/oauth/request_token",
                    "https://www.tumblr.com/oauth/access_token",
                    "https://www.tumblr.com/oauth/authorize");
            //Retrieve the URL to which the user must be sent in order to authorize the consumer
            return commonsHttpOAuthProvider.retrieveRequestToken(
                    commonsHttpOAuthConsumer,
                    "Callback URL as registered with Tumblr"
            );

2) 上一个返回语句的响应是一个URL,用户应该被重定向到该URL来登录Tumblr并授权您的应用。为了更好地控制应用程序流程,我在WebView中完成了这个操作。请参考此链接了解如何将内容加载到WebViews中。附加一个WebView客户端并覆盖shouldOverrideUrlLoading方法。这将使您能够在它们被加载之前拦截URL。Tumblr发出OAuthVerifier以进行授权后,将用其交换令牌。

public boolean shouldOverrideUrlLoading(WebView view, String strUrl) {
                //Log Current loading URL
                Log.i(TAG, strUrl);
                //Check if the Currently loading URL is that of the call back URL mentioned on top
                if (strUrl.toLowerCase().contains("Callback URL".toLowerCase())) {
                    //Parse string URL to conver to URI
                    Uri uri = Uri.parse(strUrl);
                    //instantiate String variables to store OAuth & Verifier tokens
                    String strOAuthToken = "";
                    String strOAuthVerifier = "";
                    //Iterate through Parameters retrieved on the URL
                    for (String strQuery : uri.getQueryParameterNames())
                        switch (strQuery) {
                            case "oauth_token":
                                //Save OAuth Token
                                //Note : This is not the login token we require to set on JumblrToken
                                strOAuthToken = uri.getQueryParameter(strQuery);
                                break;

                            case "oauth_verifier":
                                //Save OAuthVerifier
                                strOAuthVerifier = uri.getQueryParameter(strQuery);
                                break;
                        }
                }

3)使用OAuthVerifier交换访问令牌。

try {
        //Queries the service provider for access tokens. The method does not return anything.
        //It stores the OAuthToken & OAuthToken secret in the commonsHttpOAuthConsumer object.
        commonsHttpOAuthProvider.retrieveAccessToken(commonsHttpOAuthConsumer, strOAuthVerifier);
        //Check if tokens were received. If Yes, save them to SharedPreferences for later use.
        if(!TextUtils.isEmpty(commonsHttpOAuthConsumer.getToken())) {
            Log.i(TAG, "OAuthToken : " + commonsHttpOAuthConsumer.getToken());
        }

        if(!TextUtils.isEmpty(commonsHttpOAuthConsumer.getTokenSecret())) {    
            Log.i(TAG, "OAuthSecretToken : " + commonsHttpOAuthConsumer.getTokenSecret());
        }
    } catch (OAuthCommunicationException e) {
        e.printStackTrace();
        return null;
    } catch (OAuthExpectationFailedException e) {
        e.printStackTrace();
        return null;
    } catch (OAuthNotAuthorizedException e) {
        e.printStackTrace();
        return null;
    } catch (OAuthMessageSignerException e) {
        e.printStackTrace();
        return null;
    }

4) 一旦获取到Token和TokenSecret,就可以将它们与Jumblr一起使用,以便继续使用TumblrAPI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接