【发布时间】:2011-12-12 02:51:21
【问题描述】:
好的,所以,我正在为 Android 制作一个 Tumblr 客户端,我一直在尝试并未能让 OAuth 工作大约一周。这是怎么回事:
用户启动应用程序。主要活动的 onCreate 这样做:
settings = getSharedPreferences(PREFS_NAME, 0);
authToken=settings.getString("OauthToken", "none");
authTokenSecret=settings.getString("OauthSecret", "none");
if(authToken=="none" || authTokenSecret=="none"){
Intent i = new Intent(getApplicationContext(),Authentication.class);
startActivity(i);
}
这会启动一个包含 WebView 的身份验证活动。该活动成功获取请求令牌,并将 WebView 发送到 Tumblr 登录屏幕。用户被要求允许应用程序访问他们的数据,他们按下允许,我的 WebViewClient 捕获回调 URL,并使用它执行此操作:
String[] token = helper.getVerifier(url);
if (token != null) {
try {
String accessToken[] = helper.getAccessToken(token[1]);
editor.putString("OauthToken", accessToken[0]);
editor.putString("OauthSecret", accessToken[1]);
editor.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
finish();
帮助类的 getAccessToken 和 getVerifier 如下所示:
public String[] getVerifier(String myUrl) {
// extract the token if it exists
Uri uri = Uri.parse(myUrl);
if (uri == null) {
return null;
}
String token = uri.getQueryParameter("oauth_token");
String verifier = uri.getQueryParameter("oauth_verifier");
return new String[] { token, verifier };
}
public String[] getAccessToken(final String verifier)
throws OAuthMessageSignerException, OAuthNotAuthorizedException,
OAuthExpectationFailedException, OAuthCommunicationException {
new Thread(new Runnable() {
public void run() {
try {
mProvider.retrieveAccessToken(mConsumer, verifier);
} catch (OAuthMessageSignerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthCommunicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
return new String[] {
mConsumer.getToken(), mConsumer.getTokenSecret()
};
}
然后我终于回到主应用程序屏幕并尝试进行我的第一个 API 调用,以获取用户仪表板上最近的十个帖子:
OAuthConsumer myConsumer = new CommonsHttpOAuthConsumer(MainView.authToken, MainView.authTokenSecret);
HttpGet request = new HttpGet("http://api.tumblr.com/v2/user/dashboard?limit=10");
myConsumer.sign(request);
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
但是,我没有得到应有的良好 JSON 响应,而是得到了这个:
10-20 16:36:18.110: D/Result(22817): {"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
那么我哪里做错了?谢谢
【问题讨论】:
-
我遇到了同样的问题,我尝试使用需要 POST 请求的 API 方法,但是 GET 请求似乎工作正常。我开始怀疑他们的 API 是否有点不稳定。
-
你在开发什么版本的android?
-
我也无法获取用户信息,获取令牌和秘密后的事件:(如果有人能为此提供解决方案,那就太好了。
标签: android oauth tumblr signpost