LinkedIn/Twitter で OAuth 1 3-legged または 2-legged 承認を行う方法についての質問を見たので、JOAuthを使用して Twitter への承認をどのように達成したかの例を投稿しようと思いました。
1 に答える
net.oauth.token.v1.AccessToken
これは、Twitter からアクセス トークンを取得する方法です。
まず、アプリケーションを Twitter に登録してアプリケーションを取得するために、Twitter から 2 つのものが必要になります。
- API キー (OAuth はコンシューマー キーを呼び出します)
- API シークレット (OAuth はそれをコンシューマ シークレットと呼びます)。
ここで、Twitter に対して認証する方法を次に示します。
まず、API キーとシークレットを含む 2 つのメソッドを用意しましょう。
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
(Out-of-Band)については後で説明します。
次に、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 シークレット、OAuth サービス プロバイダー (リクエスト トークン URL、承認トークン URL、アクセス トークン URL で構成されます)。
さあ、楽しみを始めましょう:
(未承認の) リクエスト トークンのリクエスト:
リクエスト トークンを取得するには、requestUnauthorizedToken
fromOAuth1Consumer
クラスを呼び出す必要があります。
RequestToken requestToken = consumer.requestUnauthorizedToken(null, CALLBACK_URL, null, new OAuthHmacSha1Signature());
最初のパラメーターはrealm
null で (Twitter では実際には使用されないため)、次にcallback_url
、および署名メソッドです。
3 つの有効な OAuth 署名方法があります。
- PLAINTEXT (プレーンテキストでそのまま送信)、class
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
。
帯域外 (OOB) 承認
OOB 認証は、HTTP リダイレクトを実行できないが、アクセス トークンを要求したいアプリケーションに使用されます。Twitter は、HTTP リダイレクトの代わりに PIN が使用されると述べています。その PIN (Twitter アプリケーションを承認した後に表示される) は、Twitter によってブラウザー上の画像として表示されます。詳細については、Twitter OAuth API ドキュメントを参照してください。
OOB ベースの呼び出しでは、アプリケーションを承認すると、Twitter から PIN が送信されます。PIN が表示されたら、アクセス トークンを取得するには、次の手順を実行します。
String twitterPin = ""; //Whatever Twitter displayed
AccessToken accessToken = example.requestAccessToken(new AuthorizedToken(requestToken.getToken(), twitterPin), requestToken);
さあ、いくぞ。
アクセス トークンを呼び出すと、実際のアクセス トークンの値はAccessToken.getToken()
メソッド上にあります。
コールバック リダイレクト(非 OOB)
callback_url
asを設定しなかった場合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>
次に、サービスを定義します。そのサービスでは、aRequestToken
および a 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 が Access Token を受け取ったときにサービスから呼び出されるメソッドです (ここでは例として Twitter を使用していますが、任意のサービス プロバイダーを使用してかまいません)。
サーブレットは、リクエスト トークンの承認からアクセス トークンの取得までのハンドシェイクを処理し、追加のフロー コードを記述する必要はありません。
これがみんなに役立つことを願っています!