Android Tumblr oAuth Confusion
Я пытаюсь реализовать API Tumblr в приложении для Android. Я действительно застрял с авторизацией пользователей, чтобы они могли делать такие вещи, как публикация и просмотр своей панели инструментов. Я не совсем понимаю oAuth, и документация по Tumblr API как бы пропускает это. Я понятия не имею, должен ли я запрашивать у пользователя его учетные данные, или что делать с теми, кто у меня есть, или что-то подобное. Я добавил библиотеку Signpost в свой проект, но с тех пор я почесал голову. Кто-нибудь знаком с oAuth на Android, кто бы меня заинтересовал? Спасибо!
2 ответа
Да, документация не так хороша. Сначала вы должны прочитать об OAuth. Твиттер имеет хороший обзор.
Прежде всего вам нужен ключ и секретный ключ пользователя (вы можете получить их, зарегистрировав свое приложение в Tumblr). После этого вы должны использовать URL-адреса авторизации, которые предоставляет Tumblr, чтобы получить авторизацию от пользователя. Обычно вы генерируете URL-адрес запроса, с которого вы можете отправить пользователя в браузер, где он / она войдет в систему и авторизует ваше приложение. Это вызовет обратный вызов вашего приложения, и вы сможете получить токен oAuth. Сохраните это в своем приложении (SharedPreferences), чтобы вам не нужно было снова просить пользователя пройти аутентификацию. С помощью этого токена вы сможете взаимодействовать с API Tumblr, который требует аутентификации.
Обратите внимание, что вы также можете реализовать веб-просмотр вместо того, чтобы заставлять пользователя использовать браузер. Хотя, это требует немного больше работы.
Я обнаружил, что последняя библиотека указателей не работает с 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". Нет необходимости устанавливать 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");
}
Я сделал быстрый пример приложения. Вы можете проверить это здесь. Возможно, вы захотите переместить запрос в фоновый поток, поскольку он заблокирует пользовательский интерфейс.
Просто для того, чтобы у новых людей появился более простой способ реализовать это, на GitHub есть библиотека Android, чтобы войти в систему для вас. Он возвращает токены, чтобы вы могли использовать их с библиотекой Jumblr.
Изменить 1:
По рекомендации Bhargav Rao & tttony ниже 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-адреса до их загрузки. Post Authorization, 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.