Android Tumblr OAuth путаница

Я пытаюсь реализовать API Tumblr в приложении для Android. Я действительно застрял с авторизацией пользователя, чтобы они могли делать такие вещи, как post и просматривать свою панель мониторинга. Я действительно не понимаю oAuth,и документация API Tumblr вроде пропускает его. Я понятия не имею, должен ли я запрашивать у пользователя их учетные данные, или что делать с ними, когда они у меня есть, или что-то в этом роде. Я добавил библиотеку указателей в свой проект, но я чесал голову с тех пор. Кто-нибудь знаком с oAuth на Android, кто хотел бы заполнить меня? Спасибо!

2 ответов


Да, документация не так хороша. Сначала вы должны прочитать об OAuth. Twitter имеет хороший обзор.

прежде всего вам нужен потребительский ключ и секрет (вы можете получить их, зарегистрировав приложение в tumblr). После этого вы должны использовать URL-адреса аутентификации, которые предоставляет Tumblr для получения авторизации от пользователя. Обычно вы генерируете URL-адрес запроса, из которого вы можете вывести пользователя в браузер, где он/она войдет в систему и авторизовает ваше приложение. Этот вызовет обратный вызов вашего приложения, и вы сможете получить токен oAuth. Сохраните это в своем приложении (SharedPreferences), чтобы вам не нужно было снова просить пользователя аутентифицироваться. С помощью этого токена вы сможете взаимодействовать с API Tumblr, который требует аутентификации.

обратите внимание, что вы также можете реализовать 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". Нет необходимости устанавливать URL обратного вызова в настройках Tumblr.

кроме того, вам нужно будет установить фильтр намерений, чтобы ваше приложение вызывалось после авторизации. Убедитесь, что ваш манифест выглядит следующим образом:

            <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.

Edit 1:

по рекомендации Bhargav РАО & 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-это 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) После извлечения токена и TokenSecret используйте их с Jumblr для продолжения использования TumblrAPIs.