Не удалось получить токен запроса на Tumblr — ошибка 301

#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());