マイクロサービスクライアント拡張機能の使用
マイクロサービス・クライアント拡張機能は、Liferayとの通信にOAuth 2を利用するスタンドアロンのサーバープロセスです。 マイクロサービスはリソースサーバーであり、Liferayは認証サーバーである。 詳細については、 OAuth 2 の使用 を参照してください。 このデモのサンプルプロジェクトは、リソースサーバー(マイクロサービス)の保護されたルートからペイロードを取り込み、 カスタム要素 クライアント拡張機能に基づくフロントエンドウィジェットに表示します。 この例では、スタンドアロンの Spring Boot アプリケーションと連携するために、2 つのクライアント拡張タイプが使用されます。
| デプロイ可能または実行可能なコード | 種類 | 説明 | ワークスペースサンプル |
|---|---|---|---|
| LiferayサンプルOAuthアプリケーションユーザーエージェントをデプロイします | クライアント拡張機能: oAuthApplicationUserAgent | ログインしたユーザーがカスタム要素内でマイクロサービスのペイロードを確認できるように、認証チャネルを設定します。 | liferay-sample-etc-spring-boot |
| Spring Bootマイクロサービスアプリケーションを実行します。 | 保護されたエンドポイント: /dad/joke | リソースサーバーへの保護されたエンドポイント。 JWTトークンを受け取り、ペイロードを返します。 | liferay-sample-etc-spring-boot |
| Liferayサンプルカスタム要素2をデプロイする | クライアント拡張機能: customElement | カスタム要素を定義し、OAuth 2クライアントコードを介してリソースサーバーからペイロードを要求します。 | Liferayサンプルカスタム要素2 |
便宜上、このチュートリアルではサンプルワークスペースに含まれる、すぐにデプロイ可能なカスタム要素を使用します。 しかし、ここではカスタム要素クライアント拡張機能が焦点ではありません。 認証サーバーを呼び出し、リソースサーバーから取得したペイロードを表示できるフロントエンド技術であれば、カスタム要素の代わりに使用できます。
リソースサーバーには保護されたルート /dad/joke があります。 ログインしているユーザーに代わって、クライアント(つまりウィジェット)は認証サーバー(Liferay)に認証コードを要求します。 トークンが付与されると、クライアントはリソースサーバー(Spring Bootアプリケーション)と通信を開始します。
タイプ oAuthApplicationUserAgent の拡張機能は、クライアント プロファイル User Agent Application を持つものとして登録されます。これは、認証コード フローが使用されることを意味します。
前提条件
クライアント拡張の開発を開始するには、
-
サポートされているバージョンの Java をインストールしてください。
注サポートされているJDK、データベース、環境については、互換性マトリックスを確認してください。 推奨される JVM 設定については、 JVM 構成 を参照してください。
-
サンプルワークスペースをダウンロードし、解凍します。
curl -o com.liferay.sample.workspace-latest.zip https://repository.liferay.com/nexus/service/local/artifact/maven/content\?r\=liferay-public-releases\&g\=com.liferay.workspace\&a\=com.liferay.sample.workspace\&v\=LATEST\&p\=zipunzip -d liferay-sample-workspace com.liferay.sample.workspace-latest.zip注-latestサンプルワークスペースは最新の Liferay DXP リリースを対象としており、古いバージョンに対してコンパイルできることは保証されていません。 古いバージョンを対象とする場合は、Liferay DXPのバージョンに一致するサンプルワークスペースを使用してください。
これで、マイクロサービスを起動し、クライアント拡張機能をLiferayにデプロイするためのツールが揃いました。
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080 で Liferay にサインインしてください。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
マイクロサービスプロジェクトのクライアント拡張機能を検証する
client-extensions/liferay-sample-etc-spring-boot/client-extension.yaml ファイルは、サンプルワークスペース内のマイクロサービスクライアント拡張プロジェクトを定義します。 定義済みのクライアント拡張機能のほとんど(たとえば、 type: *Actionのもの)は、この例では必要ありません。 client-extension.yaml から必要な行を要約すると次のようになります。
assemble:
- fromTask: bootJar
liferay-sample-etc-spring-boot-oauth-application-user-agent:
.serviceAddress: localhost:58081
.serviceScheme: http
name: Liferay Sample Etc Spring Boot Spring Boot OAuth Application User Agent
scopes:
- Liferay.Headless.Admin.Workflow.everything
type: oAuthApplicationUserAgent
外部アプリケーション/マイクロサービスは、 Spring Boot Gradle Plugin から利用できる bootJar コマンドを使用して作成されます。 Liferay SaaSにデプロイするには、アプリケーションのJARファイルをLUFFAに含める必要があります。
client-extension.yaml の最も重要な部分は、 liferay-sample-etc-spring-boot-oauth-application-user-agent の定義にあります。 これにより、Liferayが認証サーバーとして設定され、次にデプロイするフロントエンドクライアント拡張機能がリソースサーバーのセキュアエンドポイントを呼び出し、そのペイロードを表示できるようになります。
カスタム要素プロジェクトのクライアント拡張機能を調べます
client-extensions/liferay-sample-custom-element-2/client-extension.yaml ファイルは、サンプルワークスペース内のカスタム要素クライアント拡張プロジェクトを定義します。
assemble:
- from: build/static
into: static
liferay-sample-custom-element-2:
cssURLs:
- css/main.*.css
friendlyURLMapping: liferay-sample-custom-element-2
htmlElementName: liferay-sample-custom-element-2
instanceable: false
name: Liferay Sample Custom Element 2
portletCategoryName: category.client-extensions
type: customElement
urls:
- js/main.*.js
useESM: true
詳細については、 外部アプリケーションの統合 を参照してください。
OAuthアプリケーションユーザーエージェントクライアント拡張機能をデプロイする
-
サンプルワークスペースの
client-extensions/liferay-sample-etc-spring-bootフォルダーに移動します。 -
実行
../../gradlew clean deploy -Ddeploy.docker.container.id=$(docker ps -lq) -
Liferayのログで、クライアント拡張機能がデプロイされ、起動したことを確認してください。
STARTED liferay-sample-etc-spring-boot_1.0.0 [1588] 2023-06-07 14:24:56.245 INFO [fileinstall-directory-watcher][BundleStartStopLogger:77] STARTED liferay-sample-etc-spring-boot_1.0.0 [1702] 2023-06-07 14:24:56.315 INFO [CM Event Dispatcher (Fire ConfigurationEvent: pid=com.liferay.oauth2.provider.configuration.OAuth2ProviderApplicationUserAgentConfiguration~liferay-sample-etc-spring-boot-oauth-application-user-agent)][InterpolationConfigurationPlugin:135] Replaced value of configuration property 'homePageURL' for PID com.liferay.oauth2.provider.configuration.OAuth2ProviderApplicationUserAgentConfiguration~liferay-sample-etc-spring-boot-oauth-application-user-agent 2023-06-07 14:24:56.365 INFO [CM Event Dispatcher (Fire ConfigurationEvent: pid=com.liferay.oauth2.provider.configuration.OAuth2ProviderApplicationUserAgentConfiguration~liferay-sample-etc-spring-boot-oauth-application-user-agent)][OAuth2ProviderApplicationUserAgentConfigurationFactory:179] OAuth 2 application with external reference code liferay-sample-etc-spring-boot-oauth-application-user-agent and company ID 20096 has client ID id-df5840e5-a91c-dcae-9bd8-873508a699さらに、OAuthユーザーエージェントに関するメッセージもログに記録されます。
-
OAuthアプリケーションユーザーエージェントがLiferayに追加されていることを確認してください。 コントロール パネル → OAuth2 管理 に移動します。

Liferay サンプル OAuth アプリケーション ユーザー エージェントは、Liferay が保護されたエンドポイントを介して Spring Boot アプリケーションのデータにアクセスするために必要な OAuth 2 認証 を提供します。 この場合、Liferayがアプリケーションを認証するために必要なのは、 application-default.properties に外部参照コードを宣言することだけです。
liferay.oauth.application.external.reference.codes=liferay-sample-etc-spring-boot-oauth-application-user-agent
マイクロサービスを開始する
client-extensions/liferay-etc-spring-boot/ フォルダーから、以下を実行します。
../../gradlew bootRun
Spring Bootアプリケーションが起動し、ログにメッセージを出力します。
...
2023-06-07 10:33:44.514 INFO 2897671 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 58081 (http) with context path ''
2023-06-07 10:33:44.519 INFO 2897671 --- [ main] c.l.sample.SampleSpringBootApplication : Started SampleSpringBootApplication in 1.094 seconds (JVM running for 1.262)
<==========---> 80% EXECUTING [1h 43m 56s]
> :client-extensions:liferay-sample-etc-spring-boot:bootRun
カスタム要素クライアント拡張機能をデプロイする
マイクロサービスは稼働しており、OAuth2アプリケーション通信チャネルがプロビジョニングされ、DXPで利用可能になりました。 この例では、 カスタム要素クライアント拡張機能 を使用して、マイクロサービスによって生成されたデータを表示します。 展開するには、
-
client-extensions/liferay-sample-custom-element-2フォルダーに移動します。 -
実行
../../gradlew clean deploy -Ddeploy.docker.container.id=$(docker ps -lq)
ページに親父ギャグを表示する
実行中のLiferayのページに、Liferayサンプルカスタム要素2ウィジェットを追加します。 ページを公開すると、ウィジェットに親父ギャグが表示されます。

OAuth2がリクエストを認証する方法
認証済みのユーザーがクライアントアプリケーション(カスタム要素)を含むページを読み込むと、認証コードが要求されます。この認証コードは、ユーザーエージェント拡張機能によって構成された通信チャネル(つまり、Liferayが認証サーバー)によって利用可能になります。 Liferayがコードを返した後、クライアントはアクセストークンを要求します。 トークンを使用することで、クライアントはマイクロサービスのエンドポイントにアクセスできます。 リソースサーバーは、JWKS URIエンドポイントを使用して、LiferayとJWTトークンを検証します。 これはバックグラウンドで自動的に行われます。
liferay-sample-custom-element-2クライアント拡張機能のDadJoke.jsファイルには、認証パイプラインを開始する重要な呼び出しがあります:
try {
oAuth2Client = Liferay.OAuth2Client.FromUserAgentApplication(
'liferay-sample-etc-spring-boot-oauth-application-user-agent'
);
}
この呼び出しにより、クライアントはトークンを受け取ります。クライアントは、リソース サーバーの /dad/joke ルートからリソースを要求する際に、このトークンをベアラー トークンとして使用できます。 クライアントコードは、要求先のサーバーの場所について心配する必要はありません。なぜなら、この情報はOAuth 2アプリケーション内にカプセル化されているからです。 自己ホスト環境では、OAuth アプリケーション ユーザー エージェントの client-extension.yaml プロパティで、 .serviceAddress および .serviceScheme として宣言されます。 LiferayのSaaS環境では、リソースサーバーはLiferayによって制御されるため、その場所を宣言する必要はありません。 これにより、クライアントとリソースサーバー間の通信における認証コードフローが確立されるため、あとはクライアントがリソースサーバーのエンドポイントを呼び出すだけです。 DadJoke.js は、 /dad/joke ルートから次のようにフェッチします。
React.useEffect(() => {
oAuth2Client
?.fetch('/dad/joke')
.then((response) => response.text())
.then((joke) => {
setJoke(joke);
})
.catch((error) => console.log(error));
}, []);
OAuthクライアントは、認証されたユーザーを表す JWT トークンをマイクロサービスに送信します。 認証コード、付与された権限、その他多くの詳細情報が含まれています。 このサンプルでは、便宜上、以下の詳細をログに出力します。
2023-06-08 16:01:42.617 INFO 3851009 --- [io-58081-exec-5] c.liferay.sample.DadJokeRestController : JWT Claims: {sub=20123, grant_type=authorization_code, authorization_code=404dd760ffcaa322fd38387319941990e5e10bb2d97ab360e63271f613eb33f1, scope=Liferay.Headless.Admin.Workflow.everything, iss=localhost, exp=2023-06-08T20:10:51Z, iat=2023-06-08T20:00:51Z, jti=8ffd31c001c54b1331d484731ff1e43b341dd4cb7232b98da96a4aaec6b6a6d, client_id=id-60ac3dc8-f5e8-484e-25b3-23d435e838c6, code_verifier=~zACCmEV6ZuhZHAZ0Q.RaEvGo5YUMF6x2QimtgT4lgXjWB6_Jc0QtVDNrtnxeOTfondPxH4pwxY0aAI-Op0oz1vajQTTqhrNegJnSZ4vLEBZGgE9m5Jgmi3ORDy1Bg7Q, username=test@liferay.com}
2023-06-08 16:01:42.618 INFO 3851009 --- [io-58081-exec-5] c.liferay.sample.DadJokeRestController : JWT ID: 8ffd31c001c54b1331d484731ff1e43b341dd4cb7232b98da96a4aaec6b6a6d
2023-06-08 16:01:42.618 INFO 3851009 --- [io-58081-exec-5] c.liferay.sample.DadJokeRestController : JWT Subject: 20123