#android #oauth #tumblr
#Android #oauth #tumblr
Вопрос:
Я пытаюсь войти в Tumblr, используя его Tumblr API 2.0 (OAuth 1.0a) на Android. Когда я отправляю запрос getRequestToken, я получаю ответ «301 перемещен навсегда» -> сбой. Трассировка стека отладки OAuth1Service:
10-20 10:20:34.455 2154-2387/com.package.android I/System.out: obtaining request token from http://www.tumblr.com/oauth/request_token
10-20 10:20:34.459 2154-2387/com.package.android I/System.out: setting oauth_callback to http://127.0.0.1
10-20 10:20:34.465 2154-2387/com.package.android I/System.out: generating signature...
10-20 10:20:34.466 2154-2387/com.package.android I/System.out: using base64 encoder: CommonsCodec
10-20 10:20:34.475 2154-2387/com.package.android I/System.out: base string is: POSTamp;http://www.tumblr.com/oauth/request_tokenamp;oauth_callback=http%3A%2F%2F127.0.0.1&oauth_consumer_key=kizvGnMKiwPzfKNdLoGe4UXrO4EaCXa5UsEMOVvP6KkS2xZ8QQ&oauth_nonce=1243319427&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1476948034&oauth_version=1.0
10-20 10:20:34.475 2154-2387/com.package.android I/System.out: signature is: Jm8oRzCRHwuKiBg800CjW6tpioc=
10-20 10:20:34.476 2154-2387/com.package.android I/System.out: appended additional OAuth parameters: { oauth_signature_method -> HMAC-SHA1 , oauth_consumer_key -> kizvGnMKiwPzfKNdLoGe4UXrO4EaCXa5UsEMOVvP6KkS2xZ8QQ , oauth_version -> 1.0 , oauth_timestamp -> 1476948034 , oauth_nonce -> 1243319427 , oauth_callback -> http://127.0.0.1 , oauth_signature -> Jm8oRzCRHwuKiBg800CjW6tpioc= }
10-20 10:20:34.477 2154-2387/com.package.android I/System.out: using Http Header signature
10-20 10:20:34.484 2154-2387/com.package.android I/System.out: sending request...
10-20 10:20:34.488 2154-2387/com.package.android D/NetworkSecurityConfig: No Network Security Config specified, using platform default
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: response status code: 301
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: response body: <html>
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: <head><title>301 Moved Permanently</title></head>
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: <body bgcolor="white">
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: <center><h1>301 Moved Permanently</h1></center>
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: <hr><center>nginx</center>
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: </body>
10-20 10:20:34.868 2154-2387/com.package.android I/System.out: </html>
10-20 10:20:34.870 2154-2387/com.package.android W/System.err: com.github.scribejava.core.exceptions.OAuthException: Response body is incorrect. Can't extract token and secret from this: '<html>
10-20 10:20:34.870 2154-2387/com.package.android W/System.err: <head><title>301 Moved Permanently</title></head>
10-20 10:20:34.870 2154-2387/com.package.android W/System.err: <body bgcolor="white">
10-20 10:20:34.870 2154-2387/com.package.android W/System.err: <center><h1>301 Moved Permanently</h1></center>
10-20 10:20:34.870 2154-2387/com.package.android W/System.err: <hr><center>nginx</center>
10-20 10:20:34.870 2154-2387/com.package.android W/System.err: </body>
10-20 10:20:34.870 2154-2387/com.package.android W/System.err: </html>
(потребительский ключ и секрет являются реальными, но из фиктивной учетной записи)
Странно то, что только вчера все было в порядке, и я успешно получал токен запроса. Что может быть причиной проблемы?
ОБНОВЛЕНО / РЕШЕНО — проблема была в модели ScribeJava TumblrApi. По умолчанию он содержит URL-адреса с префиксом «http», но для фактического API Tumblr требуется «https»
Комментарии:
1. Не могли бы вы поделиться своим решением? Какую версию API Tumblr вы используете?
Ответ №1:
Если у кого-то еще есть проблема… Создайте новый «пользовательский API»
public class TumblrHTTPSApi extends DefaultApi10a {
private static final String AUTHORIZE_URL = "https://www.tumblr.com/oauth/authorize?token=%s";
protected TumblrHTTPSApi() {
}
private static class InstanceHolder {
private static final TumblrHTTPSApi INSTANCE = new TumblrHTTPSApi();
}
public static TumblrHTTPSApi instance() {
return InstanceHolder.INSTANCE;
}
@Override
public String getAccessTokenEndpoint(){
return "https://www.tumblr.com/oauth/access_token";
}
@Override
public String getRequestTokenEndpoint() {
return "https://www.tumblr.com/oauth/request_token";
}
@Override
public String getAuthorizationUrl(OAuth1RequestToken requestToken) {
return String.format(AUTHORIZE_URL, requestToken.getToken());
}
}
Затем этот «новый API» можно использовать как обычно:
// create new oauth service
final OAuth10aService service = new ServiceBuilder()
.apiKey(consumerKey)
.apiSecret(consumerSecret)
.callback(callbackUrl)
.build(TumblrHTTPSApi.instance());