マイクロサービスクライアント拡張機能の使用
マイクロサービス クライアント拡張機能は、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 の拡張機能は、クライアント プロファイル ユーザー エージェント アプリケーションを持つものとして登録されます。つまり、認証コード フローが使用されることを意味します。
前提条件
クライアント拡張の開発を開始するには、
-
サポートされているバージョンの Javaをインストールします。
-
サンプルワークスペースをダウンロードし、解凍します。
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
これで、マイクロサービスを開始し、クライアント拡張機能を 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
外部アプリケーション/マイクロサービスは、 bootJar コマンドを使用して作成されます。このコマンドは、 Spring Boot Gradle プラグインから入手できます。 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