Android アプリに Tumblr API を実装しようとしています。ユーザーがダッシュボードを投稿したり表示したりできるように、ユーザーを承認することに本当に行き詰まっています。私はoAuthをよく理解していません.Tumblr APIのドキュメントは、それをスキップしています. ユーザーに資格情報の入力を求める必要があるのか 、それとも資格情報を取得したらどうするのかなど、私にはわかりません。Signpost ライブラリをプロジェクトに追加しましたが、それ以来頭を悩ませています。Android の oAuth に詳しい人で、私に情報を提供してくれる人はいますか? ありがとう!
2 に答える
はい、ドキュメントはそれほど良くありません。最初に OAuth について読む必要があります。Twitterには概要があります。
まず、コンシューマー キーとシークレットが必要です (アプリを tumblr に登録することで取得できます)。その後、Tumblr が提供する認証 URL を使用して、ユーザーから認証を取得する必要があります。通常はリクエスト URL を生成し、そこからユーザーをブラウザーに誘導して、ユーザーがログインしてアプリを承認できるようにします。これにより、アプリへのコールバックがトリガーされ、oAuth トークンを取得できるようになります。これをアプリ (SharedPreferences) に保存して、ユーザーに再度認証を求める必要がないようにします。このトークンを使用すると、認証が必要な Tumblr の API を操作できます。
ユーザーにブラウザーを使用させる代わりに、webview を実装することもできることに注意してください。ただし、これにはもう少し作業が必要です。
最新の道しるべライブラリが 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 をブロックするため、リクエストをバックグラウンド スレッドに移動することをお勧めします。
新しい人がこれを簡単に実装できるように、ユーザーをログインさせるための Android ライブラリがGitHubにあります。トークンを返すので、Jumblr ライブラリで使用できます。
編集1:
Bhargav Raoとtttonyの推奨により、以下は Tumblr のログイン プロセスの詳細です。面倒くさい部分は図書館がやってくれるのでオススメですが、手を汚すのが好きな方は…
Tumblr ログインは 3 段階のプロセスです。OAuth とは何かについては、こちらの簡易ガイドを参照してください
1) サインポスト ライブラリの 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 ステートメントの応答は、ユーザーが Tumblr にログインしてアプリを承認するためにリダイレクトされる URL です。アプリのフローをより適切に制御するために、これを Web ビューで行いました。コンテンツを 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;
}
}
OAuthVerifier
3)をアクセス トークンに交換します。
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 を引き続き使用します。