我正在尝试在Android应用程序中实现Tumblr API。我遇到的问题是如何授权用户,以便他们可以发布和查看其仪表板等操作。我对oAuth不是很了解,而Tumblr API文档似乎跳过了它。我不知道是否应提示用户输入凭据,或者获得凭证后该怎么做,或者其他任何信息。我将Signpost库添加到了我的项目中,但是从那时起一直困扰着我。有没有熟悉Android上的oAuth的人能够帮助我?谢谢!
我正在尝试在Android应用程序中实现Tumblr API。我遇到的问题是如何授权用户,以便他们可以发布和查看其仪表板等操作。我对oAuth不是很了解,而Tumblr API文档似乎跳过了它。我不知道是否应提示用户输入凭据,或者获得凭证后该怎么做,或者其他任何信息。我将Signpost库添加到了我的项目中,但是从那时起一直困扰着我。有没有熟悉Android上的oAuth的人能够帮助我?谢谢!
文档并不是很好。你应该首先了解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,所以你可能需要将请求移动到后台线程。
oauth_token
和oauth_verifier
没有问题。但是请问如何将它们转换为oauth_token
和oauth_token_secret
? - Chor Wai Chun //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。