54.2. gauth
gauth コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
重要
GAE コンポーネントは非推奨となり、JBoss Fuse の今後のリリースで削除される予定です。
Apache Camel 2.3 で利用可能
gauth コンポーネントは、Google 固有の OAuth コンシューマーを実装するために Web アプリケーションによって使用されます。他の OAuth プロバイダーもサポートするように、後で拡張されます。このコンポーネントは Google App Engine (GAE)の Camel コンポーネントに属していますが、OAuth-enable 非 GAE Web アプリケーションにも使用することができます。Google の OAuth 実装の詳細については、Google OAuth API リファレンス を参照してください。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
gauth://name[?options]
エンドポイント
名 は、を 承認 または アップグレード できます。承認 エンドポイントは、Google から承認されていないリクエストトークンを取得し、ユーザーを承認ページにリダイレクトするために使用されます。upgrade エンドポイントは、Google から OAuth コールバックを処理し、承認されたリクエストトークンを有効期限の長いアクセストークンにアップグレードするために使用されます。例については、使用方法のセクション を参照してください。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 必須 | 説明 |
|---|---|---|---|
callback
|
null
|
True ( GAuthAuthorizeBinding.GAUTH_CALLBACK メッセージヘッダーで設定することもできます)
|
アクセスの許可または拒否後にユーザーをリダイレクトする URL。 |
scope
|
null
|
true ( GAuthAuthorizeBinding.GAUTH_SCOPE メッセージヘッダーで設定することもできます)
|
アクセスするサービスを識別する URL。スコープは各 Google サービスによって定義されます。正しい値については、サービスのドキュメントを参照してください。複数のスコープを指定するには、それぞれをコンマで区切って一覧表示します。例: http://www.google.com/calendar/feeds/
|
consumerKey
|
null
|
True ( コンポーネントレベルでも設定できます)。 |
Web アプリケーションを識別するドメイン。これは、アプリケーションを Google に登録する際に使用されるドメインです。例: camelcloud.appspot.com登録されていないアプリケーションでは、匿名 を使用します。
|
consumerSecret
|
null
|
consumerSecret または keyLoaderRef のいずれかが必要です(または、コンポーネントレベルの で設定できます)。
|
Web アプリケーションのコンシューマーシークレット。コンシューマーシークレットは、アプリケーションを Google に登録する際に生成されます。HMAC-SHA1 署名方式を使用する場合は、これが必要です。登録されていないアプリケーションでは、匿名 を使用します。
|
keyLoaderRef
|
null
|
consumerSecret または keyLoaderRef のいずれかが必要です(代わりに コンポーネントレベルの に設定できます)。
|
レジストリー内の秘密鍵ローダーへの参照。camel-gae の一部は 2 つの主要なローダーです。PKCS#8 ファイルから秘密鍵を読み込む GAuthPk8Loader と、Java キーストアから秘密鍵を読み込む GAuthJksLoader です。これは、RSA-SHA1 署名メソッドを使用する場合は必要になります。これらのクラスは org.apache.camel.component.gae.auth パッケージで定義されます。
|
authorizeBindingRef
|
GAuthAuthorizeBindingへの参照
|
false |
エクスチェンジ が GoogleOAuthParameters にバインドされる方法をカスタマイズするための OutboundBinding<GAuthEndpoint, GoogleOAuthParameters, GoogleOAuthParameters > への参照。このバインディングは、teh 承認フェーズに使用されます。ほとんどのアプリケーションはデフォルト値を変更しません。
|
upgradeBindingRef
|
GAuthAuthorizeBindingへの参照
|
false |
レジストリーでの OutboundBinding<GAuthEndpoint、GoogleOAuthParameters、GoogleOAuthParameters > への参照。エクスチェンジ が GoogleOAuthParameters にバインドされる方法をカスタマイズするためのものです。このバインディングは、teh トークンのアップグレードフェーズに使用されます。ほとんどのアプリケーションはデフォルト値を変更しません。
|
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | タイプ | エンドポイント | メッセージ | 説明 |
|---|---|---|---|---|
GAuthAuthorizeBinding.GAUTH_CALLBACK
|
文字列
|
gauth:authorize
|
in |
コールバック オプションを上書きします。
|
GAuthAuthorizeBinding.GAUTH_SCOPE
|
文字列
|
gauth:authorize
|
in |
scope オプションを上書きします。
|
GAuthUpgradeBinding.GAUTH_ACCESS_TOKEN
|
文字列
|
gauth:upgrade
|
out | 有効期間の長いアクセストークンが含まれています。このトークンは、アプリケーションによってユーザーのコンテキストに保存する必要があります。 |
GAuthUpgradeBinding.GAUTH_ACCESS_TOKEN_SECRET
|
文字列
|
gauth:upgrade
|
out | アクセストークンのシークレットが含まれます。このトークンシークレットは、アプリケーションによってユーザーのコンテキストに保存する必要があります。 |
メッセージボディー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
gauth コンポーネントはメッセージの本文を読み書きしません。
コンポーネントの設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
consumerKey、consumerSecret、keyLoader などの一部のエンドポイントオプションは、通常 gauth:authorize および gauth:upgrade エンドポイントで同じ値に設定されます。gauth コンポーネントは、コンポーネントレベルでそれらを設定できるようにします。これらの設定は gauth エンドポイントによって継承され、エンドポイント URI で冗長的に設定する必要はありません。以下は、いくつかの設定例になります。
HMAC-SHA1 署名方法を使用した登録済み Web アプリケーションのコンポーネント設定
<bean id="gauth" class="org.apache.camel.component.gae.auth.GAuthComponent">
<property name="consumerKey" value="example.appspot.com" />
<property name="consumerSecret" value="QAtA...HfQ" />
</bean>
HMAC-SHA1 署名方法を使用した未登録の Web アプリケーションのコンポーネント設定
<bean id="gauth" class="org.apache.camel.component.gae.auth.GAuthComponent">
<!-- Google will display a warning message on the authorization page -->
<property name="consumerKey" value="anonymous" />
<property name="consumerSecret" value="anonymous" />
</bean>
RSA-SHA1 署名メソッドを使用した登録済み Web アプリケーションのコンポーネント設定
<bean id="gauth" class="org.apache.camel.component.gae.auth.GAuthComponent">
<property name="consumerKey" value="ipfcloud.appspot.com" />
<property name="keyLoader" ref="jksLoader" />
<!--<property name="keyLoader" ref="pk8Loader" />-->
</bean>
<!-- Loads the private key from a Java key store -->
<bean id="jksLoader"
class="org.apache.camel.component.gae.auth.GAuthJksLoader">
<property name="keyStoreLocation" value="myKeytore.jks" />
<property name="keyAlias" value="myKey" />
<property name="keyPass" value="myKeyPassword" />
<property name="storePass" value="myStorePassword" />
</bean>
<!-- Loads the private key from a PKCS#8 file -->
<bean id="pk8Loader"
class="org.apache.camel.component.gae.auth.GAuthPk8Loader">
<property name="keyStoreLocation" value="myKeyfile.pk8" />
</bean>
使用方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下は、(GAE 以外の) Web アプリケーションに OAuth を追加するための最低限の設定です。以下の例では、Web アプリケーションが
gauth.example.org で実行されていることを前提としています。
GAuthRouteBuilder.java
import java.net.URLEncoder;
import org.apache.camel.builder.RouteBuilder;
public class GAuthRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
// Calback URL to redirect user from Google Authorization back to the web application
String encodedCallback = URLEncoder.encode("https://gauth.example.org:8443/handler", "UTF-8");
// Application will request for authorization to access a user's Google Calendar
String encodedScope = URLEncoder.encode("http://www.google.com/calendar/feeds/", "UTF-8");
// Route 1: A GET request to http://gauth.example.org/authorize will trigger the the OAuth
// sequence of interactions. The gauth:authorize endpoint obtains an unauthorized request
// token from Google and then redirects the user (browser) to a Google authorization page.
from("jetty:http://0.0.0.0:8080/authorize")
.to("gauth:authorize?callback=" + encodedCallback + "&scope=" + encodedScope);
// Route 2: Handle callback from Google. After the user granted access to Google Calendar
// Google redirects the user to https://gauth.example.org:8443/handler (see callback) along
// with an authorized request token. The gauth:access endpoint exchanges the authorized
// request token against a long-lived access token.
from("jetty:https://0.0.0.0:8443/handler")
.to("gauth:upgrade")
// The access token can be obtained from
// exchange.getOut().getHeader(GAuthUpgradeBinding.GAUTH_ACCESS_TOKEN)
// The access token secret can be obtained from
// exchange.getOut().getHeader(GAuthUpgradeBinding.GAUTH_ACCESS_TOKEN_SECRET)
.process(/* store the tokens in context of the current user ... */);
}
}
OAuth シーケンスは、
http://gauth.example.org/authorize に GET リクエストを送信することでトリガーされます。その後、ユーザーは Google 承認ページにリダイレクトされます。このページへのアクセスを許可した後、Google はユーザーをコールバックを処理する Web アプリケーションにリダイレクトすると、最後に Google から有効期限の長いアクセストークンを取得します。
これら 2 つのルートは、他の Web アプリケーションフレームワークと完全に共存できます。フレームワークは、Web アプリケーション固有の機能の基盤を提供しますが、OAuth サービスプロバイダーのインテグレーションは Apache Camel で実行されます。OAuth 統合部分は、
jetty コンポーネントの代わりにサーブレットコンポーネントを使用して、既存の サーブレット コンテナーのリソースを使用することもできます。
OAuth アクセストークンについて
- アプリケーションは、現在のユーザーのコンテキストでアクセストークンを保存する必要があります。ユーザーが次回ログインする場合、OAuth の dance を再度実行せずに、アクセストークンをデータベースから直接読み込むことができます。
- その後、アクセストークンを使用して、ユーザーの代わりに Google カレンダー API などの Google サービスへのアクセスを取得します。Java アプリケーションは多くの場合、GData Java ライブラリー を使用する可能性が高くなります。ユーザーのカレンダーフィードを読み取るために GData Java ライブラリーでアクセストークンを使用する方法の 例 は、以下を参照してください。
- ユーザーは、Google Accounts ページからアクセストークンをいつでも取り消すことができます。この場合、対応する Google サービスにアクセスすると、承認例外が発生します。Web アプリケーションは、保存されたアクセストークンを削除し、別のトークンを作成するためにユーザーを Google 承認ページにリダイレクトする必要があります。
上記の例は、以下のコンポーネント設定に依存します。
<bean id="gauth" class="org.apache.camel.component.gae.auth.GAuthComponent">
<property name="consumerKey" value="anonymous" />
<property name="consumerSecret" value="anonymous" />
</bean>
GAE の例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Google App Engine アプリケーションを有効にするには、ルートビルダーでいくつかの小さな変更のみが必要になります。GAE アプリケーションのホスト名が
camelcloud.appspot.com であるとすると、設定は以下のようになります。ここでは、ghttp コンポーネントは、jetty コンポーネントの代わりに HTTP (S)要求を処理するために使用されます。
GAuthRouteBuilder
import java.net.URLEncoder;
import org.apache.camel.builder.RouteBuilder;
public class TutorialRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
String encodedCallback = URLEncoder.encode("https://camelcloud.appspot.com/handler", "UTF-8");
String encodedScope = URLEncoder.encode("http://www.google.com/calendar/feeds/", "UTF-8");
from("ghttp:///authorize")
.to("gauth:authorize?callback=" + encodedCallback + "&scope=" + encodedScope);
from("ghttp:///handler")
.to("gauth:upgrade")
.process(/* store the tokens in context of the current user ... */);
}
}
アクセストークンの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、アクセストークンを使用して、GData Java ライブラリー でユーザーの Google カレンダーデータにアクセスする方法を示しています。サンプルアプリケーションは、ユーザーのパブリックおよびプライベートカレンダーのタイトルを
stdout に書き込みます。
アクセストークンの使用
import com.google.gdata.client.authn.oauth.OAuthHmacSha1Signer;
import com.google.gdata.client.authn.oauth.OAuthParameters;
import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.calendar.CalendarEntry;
import com.google.gdata.data.calendar.CalendarFeed;
import java.net.URL;
public class AccessExample {
public static void main(String... args) throws Exception {
String accessToken = ...
String accessTokenSecret = ...
CalendarService myService = new CalendarService("exampleCo-exampleApp-1.0");
OAuthParameters params = new OAuthParameters();
params.setOAuthConsumerKey("anonymous");
params.setOAuthConsumerSecret("anonymous");
params.setOAuthToken(accessToken);
params.setOAuthTokenSecret(accessTokenSecret);
myService.setOAuthCredentials(params, new OAuthHmacSha1Signer());
URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/");
CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class);
System.out.println("Your calendars:");
System.out.println();
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
CalendarEntry entry = resultFeed.getEntries().get(i);
System.out.println(entry.getTitle().getPlainText());
}
}
}