6

我正在尝试在 Android 应用程序中实现 Tumblr API。我真的被授权用户卡住了,这样他们就可以做一些事情,比如发布和查看他们的仪表板。我不太了解 oAuth,Tumblr API 文档有点跳过它。我不知道我是否应该提示用户输入他们的凭据,或者一旦我有了这些凭据该怎么办,或者类似的事情。我将 Signpost 库添加到我的项目中,但从那时起我一直在摸不着头脑。任何熟悉 Android 上的 oAuth 的人愿意填写我的信息吗?谢谢!

4

2 回答 2

13

是的,文档不是那么好。您应该首先阅读 OAuth。Twitter有一个很好的概述。

首先,您需要一个消费者密钥和秘密(您可以通过在 tumblr 中注册您的应用程序来获取这些信息)。之后,您应该使用 Tumblr 提供的身份验证 URL 从用户那里获得授权。通常您会生成一个请求 URL,您可以从该 URL 将用户带到他/她将登录并授权您的应用程序的浏览器。这将触发对您的应用的回调,您将能够获取 oAuth 令牌。将此保存在您的应用程序 (SharedPreferences) 中,这样您就无需再次要求用户进行身份验证。使用此令牌,您将能够与需要身份验证的 Tumblr 的 API 进行交互。

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

我发现最新的路标库不适用于 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。

于 2011-10-15T07:35:49.160 回答
3

刚刚进来的新人有一个更简单的方法来实现这一点,GitHub上有一个Android库可以为你登录用户。它返回令牌,因此您可以将它们与 Jumblr 库一起使用。

编辑1:

Bhargav Raotttony的推荐下,以下是 Tumblr 登录过程的详细说明。虽然我建议使用该库,因为它可以处理杂乱的部分,但对于那些喜欢弄脏手的人来说......

Tumblr 登录是一个 3 阶段的过程。有关 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) 前一个 return 语句的响应是一个 URL,用户应该被重定向到他登录到 Tumblr 并授权您的应用程序。我在 webview 中这样做是为了更好地控制应用程序流。有关如何将内容加载到 WebViews 的信息,请参阅此内容。附加 WebView 客户端并覆盖该shouldOverrideUrlLoading方法。这将使您能够在加载 URL 之前拦截它们。授权后,tumblr 发出一个OAuthVerifier将用于交换 Tokens 的文件。

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。

于 2016-05-18T13:37:27.207 回答