Это способ получения токена доступа 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 в качестве примера, но не стесняйтесь использовать любого поставщика услуг).
Сервлет обрабатывает квитирование от авторизации моего токена запроса и получения токена доступа без необходимости написания дополнительного кода потока.
Надеюсь, это поможет всем!