Клиент Google OAuth Java и Twitter API

У меня возникают проблемы с вызовом twitter REST API с помощью Java-клиента Google OAuth < / а>. Я могу правильно сделать первые шаги:

  1. Установите URL-адрес авторизации,
  2. Получите временный токен,
  3. Сгенерируйте последний токен.

Затем OAuth Javadoc говорит:

Используйте сохраненный токен доступа для авторизации HTTP-запросов к защищенным ресурсам, задав OAuthParameters.token и используя OAuthParameters в качестве HttpRequestInitializer.

Именно на этом этапе у меня возникают проблемы. Прежде всего, если я установлю только значение OAuthParameters.token, я получу нулевое исключение, потому что подписывающая сторона не установлена, поэтому в настоящее время у меня есть:

    OAuthHmacSigner signer = new OAuthHmacSigner();
    signer.clientSharedSecret=TWITTER_CONSUMER_SECRET;
    String oauthToken = req.getParameter("oauth_token");
    String oauthVerifier = req.getParameter("oauth_verifier");
    OAuthGetAccessToken accessTokenRequest = new OAuthGetAccessToken(TWITTER_ACESS_TOKEN_URL);
    accessTokenRequest.consumerKey=TWITTER_CONSUMER_KEY;
    accessTokenRequest.signer=signer;
    accessTokenRequest.transport=HTTP_TRANSPORT;
    accessTokenRequest.temporaryToken=oauthToken;
    accessTokenRequest.verifier=oauthVerifier;
    OAuthCredentialsResponse credentials = accessTokenRequest.execute();
    String token = credentials.token;
    OAuthParameters params = new OAuthParameters();
    params.token=token;
    params.version="1.0";
    params.consumerKey=TWITTER_CONSUMER_KEY;
    params.signer=signer;
    HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory(params);
    HttpResponse twResponse = requestFactory.buildGetRequest(new GenericUrl("https://api.twitter.com/1.1/account/verify_credentials.json")).execute();

Результат всегда:

ВНИМАНИЕ: ошибка аутентификации: невозможно ответить ни на одну из этих проблем: {} com.google.api.client.http.HttpResponseException: 401 OK {"errors": [{"message": "Не удалось аутентифицировать вас", "code ": 32}]}

Если я попробую заголовок авторизации, предоставленный инструментом Twitter OAuth через инструмент расширения REST Chrome, он будет работать отлично, так что это не проблема с учетной записью. Когда я меняю его на значение заголовка авторизации, вычисленное клиентской библиотекой Google OAuth Java, оно не работает.

Я не понимаю, что делаю неправильно.

Решение. Следуйте инструкциям по ссылке, предоставленной @Arkanon, я пропустил обновление секретного токена подписывающего лица:

signer.tokenSharedSecret

person out_sid3r    schedule 28.10.2013    source источник
comment
вы пробовали сделать это с помощью какой-либо другой библиотеки?   -  person Jhanvi    schedule 01.11.2013
comment
нет, я не ... я открыл эту награду именно для того, чтобы понять, почему она не работает с этой, то есть просить помощи у кого-то, кто использовал ее с твиттером или другим провайдером oauth1.0   -  person out_sid3r    schedule 01.11.2013


Ответы (1)


Я только что изменил код на этой странице о используя google-oauth-java-client для отправки запроса в Twitter, и он работал нормально, как только я заменил соответствующий блок следующим образом:

while (currentLine.equalsIgnoreCase("n")) {
    System.out.println("Enter the verification PIN provided by Twitter:");
    currentLine = in.readLine();
}

а затем добавил к объекту accessToken следующее:

accessToken.verifier = currentLine;

После того, как PIN-код, предоставленный сайтом Twitter, введен в консоль Java и вы нажмете Enter, процесс завершится, появится доступ к защищенному ресурсу и будет получен желаемый ответ JSON.

Единственные другие изменения, которые я внес в этот код, заключались в предоставлении констант Twitter следующим образом:

private static final String CONSUMER_KEY =
        "enter-your-consumer-key-here";
private static final String CONSUMER_SECRET =
        "enter-your-consumer-secret-here";
private static final String PROTECTED_SERVICE_URL =
        "https://api.twitter.com/1.1/statuses/home_timeline.json";
private static final String REQUEST_TOKEN_URL =
        "https://api.twitter.com/oauth/request_token";
private static final String AUTHORIZE_URL =
        "https://api.twitter.com/oauth/authenticate";
private static final String ACCESS_TOKEN_URL =
        "https://api.twitter.com/oauth/access_token";

Возможно, это не тот процесс, на который вы рассчитываете, но, надеюсь, код на этой странице поможет вам обнаружить все, что вы могли неправильно понять. (И я согласен с тем, что документация для библиотек Google - это еще не все, что могло бы быть.)

person Bobulous    schedule 03.11.2013
comment
извините, но что вы имеете в виду под PIN-кодом? Я думал, что после получения токена доступа мне не нужно будет ничего делать, кроме как использовать его с OAuthParameters. Точно так же, как после строки 100 кода в URL, который вы написали. - person out_sid3r; 03.11.2013
comment
Механизм OAuth требует, чтобы приложение направляло пользователя на веб-сайт провайдера (в данном случае twitter.com) для посещения URL-адреса авторизации. Затем сайт спрашивает пользователя, хотите ли вы разрешить NAME-OF-APP доступ к вашим данным. Если пользователь соглашается, ему показывается новый экран (на сайте twitter.com) с PIN-кодом подтверждения, который они должны предоставить приложению Java, чтобы оно могло собрать токен доступа. Если вы создаете веб-приложение, ваш код может просто перенаправить браузер пользователя на twitter.com, и Twitter может направить его обратно, в противном случае потребуется PIN-код. - person Bobulous; 03.11.2013
comment
Значит, я должен делать все точно так, как в приведенной вами ссылке, верно? Я имею в виду, что поскольку это веб-приложение, мне не нужен PIN-код, верно? - person out_sid3r; 03.11.2013
comment
Тогда вместо PIN-кода, введенного пользователем вручную, URL-адрес, на который Twitter перенаправляет пользователя (после авторизации), должен содержать параметр строки запроса, который является кодом подтверждения. См. страницу Twitter с описанием процесса. Вам нужно извлечь проверочный код из строки запроса, которую предоставляет Twitter, а затем добавить его к объекту токена доступа. - person Bobulous; 03.11.2013
comment
это именно то, что я делаю, только что обновил вопрос. Можете ли вы сделать это без ПИН-кода? Как вы думаете, возможно ли, что подпись неправильно сгенерирована на основе предоставленного токена? - person out_sid3r; 03.11.2013
comment
Можете ли вы добавить к своему вопросу строку, в которой вы определяете значение переменной signer? - person Bobulous; 03.11.2013
comment
готово ... первая строка ... но я имею в виду, что запрос токена работает, но не тот, который указан в verify_credentials - person out_sid3r; 03.11.2013