Android Tumblr oAuth Confusion - PullRequest
       33

Android Tumblr oAuth Confusion

6 голосов
/ 15 октября 2011

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

Ответы [ 2 ]

13 голосов
/ 15 октября 2011

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

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

Обратите внимание, что вы также можете реализовать веб-просмотр вместо того, чтобы заставлять пользователя использовать браузер. Хотя это требует немного больше работы.

Я обнаружил, что последняя библиотека указателей не работает с 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");
}

Я сделал быстрый пример приложения. Вы можете проверить это здесь . Возможно, вы захотите переместить запрос в фоновый поток, поскольку он заблокирует пользовательский интерфейс.

3 голосов
/ 18 мая 2016

Просто для того, чтобы у новых людей появился более простой способ реализовать это, на GitHub есть библиотека Android, чтобы войти в систему для вас.Он возвращает токены, поэтому вы можете использовать их с библиотекой Jumblr.

Редактировать 1:

По рекомендации Бхаргав Рао & 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) Ответом предыдущего оператора возврата является URL-адрес, по которому пользователь должен быть перенаправлен на него, чтобы он мог войти в Tumblr и авторизовать ваше приложение.Я сделал это в веб-представлении для лучшего контроля над потоком приложений. Обратитесь к этому за информацией о том, как загрузить контент в 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.

...