我正在尝试在 Android 应用程序中实现 Tumblr API。我真的被授权用户卡住了,这样他们就可以做一些事情,比如发布和查看他们的仪表板。我不太了解 oAuth,Tumblr API 文档有点跳过它。我不知道我是否应该提示用户输入他们的凭据,或者一旦我有了这些凭据该怎么办,或者类似的事情。我将 Signpost 库添加到我的项目中,但从那时起我一直在摸不着头脑。任何熟悉 Android 上的 oAuth 的人愿意填写我的信息吗?谢谢!
2 回答
是的,文档不是那么好。您应该首先阅读 OAuth。Twitter有一个很好的概述。
首先,您需要一个消费者密钥和秘密(您可以通过在 tumblr 中注册您的应用程序来获取这些信息)。之后,您应该使用 Tumblr 提供的身份验证 URL 从用户那里获得授权。通常您会生成一个请求 URL,您可以从该 URL 将用户带到他/她将登录并授权您的应用程序的浏览器。这将触发对您的应用的回调,您将能够获取 oAuth 令牌。将此保存在您的应用程序 (SharedPreferences) 中,这样您就无需再次要求用户进行身份验证。使用此令牌,您将能够与需要身份验证的 Tumblr 的 API 进行交互。
请注意,您还可以实现 web 视图,而不是让用户使用浏览器。不过,这需要更多的工作。
我发现最新的路标库不适用于 Tumblr。您将需要一个旧版本。前往此处并下载这些文件:
- 路标核心1.2.jar
- signpost-commonshttp4-1.2.jar(如果您想针对 pre-froyo 设备,则特别需要此文件)
将这两个库导入您的项目。要使用它们,基本上你需要调用以下代码:
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。
刚刚进来的新人有一个更简单的方法来实现这一点,GitHub上有一个Android库可以为你登录用户。它返回令牌,因此您可以将它们与 Jumblr 库一起使用。
编辑1:
在Bhargav Rao和tttony的推荐下,以下是 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。