OAuth 1 авторизация с JOAuth, нужен пример - PullRequest
2 голосов
/ 15 июня 2011

Поскольку я видел вопросы о том, как выполнить OAuth 1 3-х или 2-х стороннюю авторизацию в LinkedIn / Twitter, я подумал, что опубликую пример того, как мне удалось авторизоваться в Twitter с помощью JOAuth .

1 Ответ

3 голосов
/ 15 июня 2011

Это способ получения токена доступа net.oauth.token.v1.AccessToken из Twitter.

Сначала вам понадобятся 2 вещи из Twitter, которые необходимы для регистрации приложения в Twitter и получения приложения:

  • Ключ API (который OAuth называет ключом потребителя)
  • Секрет API (который OAuth называет секретом потребителя).

Теперь вот как мыПроверка подлинности в Твиттере:

во-первых, у нас есть 2 метода, которые содержат наш ключ API и секрет:

private static final String API_KEY = "TWITTER_API_KEY_HERE";
private static final String API_SECRET  = "TWITTER_API_SECRET_HERE";

О да, нам нужен callback_url:

private static final String CALLBACK_URL = "oob";

Я объясню oob (вне диапазона) позже.

Затем нам нужно создать потребителя, который будет выполнять авторизацию OAuth для нас:

private OAuth1Consumer consumer = new OAuth1Consumer(API_KEY, API_SECRET, new OAuth1ServiceProvider("https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/authorize", "https://api.twitter.com/oauth/access_token"));

Параметры следующие: ключ API, следующий - API Secret, поставщик услуг OAuth (состоящий из URL-адреса запроса токена, URL-адреса авторизованного токена, URL-адреса токена доступа).

Теперь начнем веселье:

Запрос (несанкционированного) токена запроса :

Чтобы получить токен запроса, нам нужно вызватьrequestUnauthorizedToken из OAuth1Consumer class:

RequestToken requestToken = consumer.requestUnauthorizedToken(null, CALLBACK_URL, null, new OAuthHmacSha1Signature());

Первый параметр - realm, который имеет значение null (поскольку Twitter его не использует), затем callback_url и метод подписи.

Существует 3 допустимых метода подписи OAuth:

  • PLAINTEXT (отправлять как есть, в незашифрованном виде), класс OAuthPlainTextSignature.
  • HMAC-SHA1, класс OAuthHmacSha1Signature.
  • RSA-SHA1, класс OAuthRsaSha1Signature.

Twitter использует HMAC-SHA1, пожалуйста, обращайтесь к документации при выполнении OAuth другим провайдерам.

Теперь, когда у нас есть неавторизованный токен запроса, давайте авторизуем его.

Авторизация (неавторизованного) токена запроса :

Авторизация требует от пользователяперейдите по URL поставщика услуг и войдите в систему, поэтому нам нужен URL, который мы можем перенаправить в нашем браузере.

String url = consumer.createOAuthUserAuthorizationUrl(requestToken, null);

(2-й параметр - null поскольку у нас нет дополнительных параметров HTTP для отправки, но если вы это сделаете, создайте атрибуты Map<String, String>, заполните их и разбейте на части в вызове метода:))

Теперь, когда у нас естьURL, добавьте URL в браузер, авторизуйте приложение, и вот где callback_url входит:

Out-of-Band (OOB) Авторизация

OOB-авторизация используется для приложений, которые не могут выполнить перенаправление HTTP, но все же хотят запросить токен доступа.Twitter заявляет, что вместо перенаправления HTTP используется PIN-код.Этот PIN-код (отображается после авторизации приложения Twitter) отображается Twitter как изображение в браузере.Для получения дополнительной информации см. Документация по Twitter OAuth API .

При вызове на основе OOB, как только вы авторизуете приложение, Twitter отправляет вам PIN-код: Как только вы увидите пин-код, чтобы получить AccessТокен, сделайте следующее:

String twitterPin = ""; //Whatever Twitter displayed
AccessToken accessToken = example.requestAccessToken(new AuthorizedToken(requestToken.getToken(), twitterPin), requestToken);

И вот мы здесь.

Как только вы вызвали свой токен доступа, реальное значение токена доступа - метод AccessToken.getToken().

Перенаправление обратного вызова (не OOB)

Есливы не установили callback_url как oob, Twitter будет перенаправлять обратно на ваше приложение после авторизации вашего приложения с авторизованным токеном.Я создал процесс, который обработал это, поэтому нам понадобится наш OAuthServlet, чтобы сделать это для нас.

Во-первых, нам нужно создать oauth-config.xml в рамках проекта WEB-INF нашего проекта, напримерИтак:

<?xml version="1.0" encoding="UTF-8"?>
<oauth-config>
<!-- Twitter OAuth Config -->
        <oauth name="twitter" version="1">
                <consumer key="TWITTER_KEY" secret="TWITTER_SECRET" />
                <provider requestTokenUrl="https://api.twitter.com/oauth/request_token" authorizationUrl="https://api.twitter.com/oauth/authorize" accessTokenUrl="https://api.twitter.com/oauth/access_token" />
        </oauth>


        <service path="/request_token_ready" class="com.neurologic.example.TwitterOAuthService" oauth="twitter">
                <success path="/start.htm" />
        </service>
</oauth-config>

Затем нам нужно настроить наш web.xml, чтобы он включал OAuthServlet.

<servlet>
    <description>An OAuth Servlet Controller</description>
    <display-name>OAuthServlet</display-name>
    <servlet-name>OAuthServlet</servlet-name>
    <servlet-class>com.neurologic.oauth.servlet.OAuthServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/oauth-config.xml</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>OAuthServlet</servlet-name>
    <url-pattern>/oauth/*</url-pattern>
</servlet-mapping>

А теперь определим Сервис.Эта услуга потребует от нас предоставить RequestToken и realm (если вы того пожелаете).Мой полный исходный код выглядит следующим образом.Я сохранил свой токен запроса, полученный выше в сеансе до вызова сервиса.

/**
 * 
 */
package com.neurologic.example;

import javax.servlet.http.HttpServletRequest;

import net.oauth.signature.OAuthSignature;
import net.oauth.signature.impl.OAuthHmacSha1Signature;
import net.oauth.token.v1.AccessToken;
import net.oauth.token.v1.RequestToken;

import com.neurologic.oauth.service.impl.OAuth1Service;

/**
 * @author Buhake Sindi
 * @since 31 May 2011
 *
 */
public class TwitterOAuthService extends OAuth1Service {

    public static final String TWITTER_REQUEST_TOKEN_SESSION = "TWITTER_REQUEST_TOKEN_SESSION";
    public static final String TWITTER_ACCESS_TOKEN_SESSION = "TWITTER_ACCESS_TOKEN_SESSION";

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getOAuthSignature()
     */
    @Override
    protected OAuthSignature getOAuthSignature() {
        // TODO Auto-generated method stub
        return new OAuthHmacSha1Signature();
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getRealm()
     */
    @Override
    protected String getRealm() {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getRequestToken(javax.servlet.http.HttpServletRequest)
     */
    @Override
    protected RequestToken getRequestToken(HttpServletRequest request) {
        // TODO Auto-generated method stub
        return (RequestToken) request.getSession().getAttribute(TWITTER_REQUEST_TOKEN_SESSION);
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.OAuthService#saveAccessToken(javax.servlet.http.HttpServletRequest, java.lang.Object)
     */
    @Override
    public void saveAccessToken(HttpServletRequest request, AccessToken accessToken) {
        // TODO Auto-generated method stub
        request.getSession().setAttribute(TWITTER_ACCESS_TOKEN_SESSION, accessToken);
    }
}

Метод saveAccessToken() из сервиса - это метод, вызываемый сервисом при получении токена доступа через Twitter(Я использую Twitter в качестве примера, но не стесняйтесь использовать любого поставщика услуг).

Сервлет обрабатывает квитирование от авторизации моего токена запроса и получения токена доступа без необходимости написания дополнительного кода потока.

Надеюсь, это поможет всем!

...