Integrating Microservices
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

マイクロサービスクライアント拡張機能の使用

マイクロサービス クライアント拡張機能は、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 の拡張機能は、クライアント プロファイル ユーザー エージェント アプリケーションを持つものとして登録されます。つまり、認証コード フローが使用されることを意味します。

前提条件

クライアント拡張の開発を開始するには、

  1. サポートされているバージョンの Javaをインストールします。

    サポートされている JDK、データベース、環境については、 互換性マトリックス を確認してください。 推奨される JVM 設定については、 JVM 構成 を参照してください。

  2. サンプルワークスペースをダウンロードし、解凍します。

    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\=zip
    
    unzip -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 アプリケーション ユーザー エージェント クライアント拡張機能をデプロイする

  1. サンプルワークスペースの client-extensions/liferay-sample-etc-spring-boot フォルダに移動します。

  2. 実行

    ../../gradlew clean deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
  3. 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 ユーザー エージェントに関するメッセージも記録されます。

  4. OAuth アプリケーション ユーザー エージェントが Liferay に追加されたことを確認します。 コントロール パネルOAuth2 管理に移動します。

    クライアント拡張機能をデプロイすると、Liferay サンプル OAuth アプリケーション ユーザー エージェントが追加されます。

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 で利用できるようになりました。 この例では、 カスタム要素クライアント拡張 を使用して、マイクロサービスによって生成されたデータを表示します。 展開するには、

  1. client-extensions/liferay-sample-custom-element-2 フォルダに移動します。

  2. 実行

    ../../gradlew clean deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

ページにお父さんジョークを表示する

実行中の Liferay のページに Liferay サンプル カスタム エレメント 2 ウィジェットを追加します。 ページを公開すると、ウィジェットに父親のジョークが表示されます。

カスタム要素 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