6

Android アプリに Tumblr API を実装しようとしています。ユーザーがダッシュボードを投稿したり表示したりできるように、ユーザーを承認することに本当に行き詰まっています。私はoAuthをよく理解していません.Tumblr APIのドキュメントは、それをスキップしています. ユーザーに資格情報の入力を求める必要があるのか​​ 、それとも資格情報を取得したらどうするのかなど、私にはわかりません。Signpost ライブラリをプロジェクトに追加しましたが、それ以来頭を悩ませています。Android の oAuth に詳しい人で、私に情報を提供してくれる人はいますか? ありがとう!

4

2 に答える 2

13

はい、ドキュメントはそれほど良くありません。最初に OAuth について読む必要があります。Twitterには概要があります。

まず、コンシューマー キーとシークレットが必要です (アプリを tumblr に登録することで取得できます)。その後、Tumblr が提供する認証 URL を使用して、ユーザーから認証を取得する必要があります。通常はリクエスト URL を生成し、そこからユーザーをブラウザーに誘導して、ユーザーがログインしてアプリを承認できるようにします。これにより、アプリへのコールバックがトリガーされ、oAuth トークンを取得できるようになります。これをアプリ (SharedPreferences) に保存して、ユーザーに再度認証を求める必要がないようにします。このトークンを使用すると、認証が必要な Tumblr の API を操作できます。

ユーザーにブラウザーを使用させる代わりに、webview を実装することもできることに注意してください。ただし、これにはもう少し作業が必要です。

最新の道しるべライブラリが 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

新しい人がこれを簡単に実装できるように、ユーザーをログインさせるための Android ライブラリがGitHubにあります。トークンを返すので、Jumblr ライブラリで使用できます。

編集1:

Bhargav Raotttonyの推奨により、以下は 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;
                        }
                }

OAuthVerifier3)をアクセス トークンに交換します。

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 に答える