JAX-RS
JAX-RSウェブサービスは、Liferayモジュール内でもLiferay外部でも同じように動作しますが、OSGiフレームワークにクラスを登録する必要があります。 これらのアプリケーションの作成方法については、 Jakarta のドキュメント を参照してください。 ここでは、JAX-RSアプリケーションをLiferayに統合および認証する方法を示します。
サンプルのREST APIをデプロイする
この例では、カタログ内のIDに基づいてテスト製品を返すAPIの例を示します。 この例の仕組みを理解すれば、独自のアプリケーション用のAPIを作成できるようになります。
新しい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に変更します。
次に、以下の手順に従います。
-
liferay-u6b1.zipサンプルプロジェクトをダウンロードして解凍します。curl https://resources.learn.liferay.com/examples/liferay-u6b1.zip -Ounzip liferay-u6b1.zip -
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされた jar ファイルを Docker コンテナ上の
/opt/liferay/osgi/modulesにコピーすることと同じです。 -
Dockerコンテナコンソールでデプロイを確認してください。
STARTED com.liferay.headless.admin.site.internal.jaxrs.application_1.0.0
JAX-RS Webサービスの認証
認証方法には、基本認証とOAuth 2.0の2種類があります。 基本認証は本番環境では決して使用すべきではありません。開発中の開発者の利便性のために用意されているものであり、使いやすいという利点があります。 URL上で渡される認証情報はサーバーログに記録されるため、ログにアクセスできる人物に認証情報が漏洩する可能性がある。
基本認証で認証する場合、 サービスアクセス ポリシー SYSTEM_USER_PASSWORD が適用されます。 OAuth 2.0 を介して認証する場合、 AUTHORIZED_OAUTH2_SAP ポリシーが適用されます。 デフォルトではすべてのリモートサービスを呼び出すことができるため、ご使用の環境に合わせて適切に設定してください。 JAX-RSエンドポイントのサービスアクセスポリシーの適用を無効にして、ゲストがデフォルトのサービスアクセスポリシーなしでこれらのエンドポイントを呼び出せるようにするには、 liferay.access.control.disable プロパティを true に設定します。
@Component(
property = {
JaxrsWhiteboardConstants.JAX_RS_APPLICATION_BASE + "=/greeting",
JaxrsWhiteboardConstants.JAX_RS_NAME + "=Greeting.Rest",
"liferay.access.control.disable=true"
},
service = Application.class)
サービスアクセスポリシーの適用を無効にすることは推奨されません。 コードを本番環境にデプロイする前に、必ず再度有効化することを忘れないでください。
META-INF/services/com.liferay.portal.security.auth.verifier.internal.tracker.AuthVerifierFilterTracker.config ファイルで次のプロパティを設定することにより、OAuth 2.0 とポータルセッション認証を有効にしたまま、すべての JAX-RS アプリケーションの基本認証を無効にすることができます。
default.registration.property=["filter.init.auth.verifier.OAuth2RESTAuthVerifier.urls.includes=*","filter.init.auth.verifier.PortalSessionAuthVerifier.urls.includes=*"]
開発中:基本認証の使用
JAX-RSアプリケーションをデプロイすると、そのアプリケーションに対して認証検証フィルターが登録されます。 プロパティの前にauth.verifierを付けることで、@Componentアノテーションでプロパティを設定できます。 例えば、この設定を使用して、サービスへのゲストアクセスを無効にします。
@Component(
property = {
JaxrsWhiteboardConstants.JAX_RS_APPLICATION_BASE + "=/greeting",
JaxrsWhiteboardConstants.JAX_RS_NAME + "=Greeting.Rest",
"auth.verifier.guest.allowed=false"
},
service = Application.class)
このようにゲストアクセスを無効にし、サービスアクセスポリシーの適用も無効にすると、エンドポイントは完全に公開されます。 これは本番環境での使用には推奨されません。 その代わりに、公開する特定のエンドポイントをホワイトリストに登録することをお勧めします。
OAuth 2.0の使用
JAX-RSウェブサービスは、デフォルトで認証を必要とします。 これを有効にするには、まず OAuth 2.0 アプリケーション を作成して、サービスへのアクセスを許可する方法を提供する必要があります。 ヘッドレス サーバー プロファイルを選択してください。このプロファイルは クライアント認証情報 認証タイプを使用するため、サービスを非対話的に呼び出すことができます。 次に、サービスへのアクセスを容易にするために、
-
新しいOAuth 2.0アプリケーションを開いてください。
-
スコープ タブをクリックします。
-
矢印をクリックして
Greeting.Restサービスを展開します。 -
というラベルの付いたボックス をチェックしてください。
-
[保存]をクリックします。
次に、新しいOAuth 2.0アプリケーション用に生成されたクライアントIDとクライアントシークレットを使用して、OAuthトークンを要求する必要があります。 簡略化のため、以下の例では Curl を使用して認証します。 ローカル環境でテストする場合は、次のようなリクエストを送信してください。
curl http://localhost:8080/o/oauth2/token -d 'grant_type=client_credentials&client_id=[Your Client ID here]&client_secret=[Your Client Secret here]'
JSON形式のレスポンスには、このクライアント用に生成されたトークンが含まれています。 例:
{"access_token":"a7f12bef7f2e578cf64bce4085db8f17b6a3c2963f865a65b374e89784bbca5","token_type":"Bearer","expires_in":600,"scope":"GET POST PUT"}
このアクセス許可は600秒後に期限切れとなり、このWebサービスに対してGET、POST、PUTのリクエストを許可します。 サービスを呼び出す際には、HTTPヘッダーにトークンを含める必要があります。例:
curl --header "Authorization: Bearer [Your access token here]" http://localhost:8080/o/greeting
認証があれば、ウェブサービスを呼び出すことができ、ウェブサービスはそのリクエストに応答します。
Hello, World!
CurlはOAuth 2.0で認証を行うための多くの方法の一つですが、本番環境での使用は推奨されません。 詳細については、 OAuth 2.0 の使用 を参照してください。
OAuth 2.0のスコープ
OAuth 2.0のアノテーションやプロパティを持たない標準的なJAX-RSアプリケーションでは、スコープはアプリケーションがサポートするHTTP動詞に基づいて決定されます。 スコープを指定するには、oauth2.scope.checker.type=annotationsプロパティと、Liferay OAuth2 Provider Scope APIバンドルからエクスポートされたcom.liferay.oauth2.provider.scope.RequiresScopeアノテーションを使用して、エンドポイントリソースのメソッドやクラス全体にこのようなアノテーションを付けます:
@RequiresScope("scopeName")
デプロイされると、これは OAuth 2.0 構成 のスコープになります。 スコープチェッカーを存在しない型に設定することで、スコープチェックを無効にすることができます(推奨されません)。
@Component(
property = {
JaxrsWhiteboardConstants.JAX_RS_APPLICATION_BASE + "=/greeting",
JaxrsWhiteboardConstants.JAX_RS_NAME + "=Greeting.Rest",
"oauth2.scope.checker.type=none"
},
service = Application.class)
@Component アノテーションでこのプロパティを使用することで、JAX-RS アプリケーションに必要な OAuth 2.0 認証を指定できます。
osgi.jaxrs.extension.select=(osgi.jaxrs.name=Liferay.OAuth2)
JAX-RSとCORSの使用
デプロイ済みの JAX-RS アプリケーションに @CORS アノテーションを使用して CORS ポリシー を定義すると、別のドメインからアクセスできるようになります。
- モジュールの
build.gradleファイルに Portal Remote CORS API の依存関係を追加します。
compileOnly project(":apps:portal-remote:portal-remote-cors-api")
- アプリケーションのプロパティでCORSアノテーション機能を有効にしてください。
@Component(
property = {
"osgi.jaxrs.application.base=/my-application",
"osgi.jaxrs.name=My.Application.Name",
"liferay.cors.annotation=true"
},
service = Application.class
)
@CORSアノテーションをアプリケーション全体でグローバルに、またはメソッドごとに使用します。
世界的に:
@CORS(allowMethods="GET")
public class HeadlessAdminSiteApplication extends Application {
方法別:
@CORS
@GET
@Path("/users")
public List<User> getUserList() throws Exception {
return _users;
}
これらの注釈は管理者によって上書きできます。
アノテーションを使用すると、任意の CORS ヘッダーの設定を指定できます。
| ヘッダ | 注釈の例 |
|---|---|
| アクセス制御許可資格情報 | @CORS(allowCredentials = false) |
| アクセス制御許可ヘッダー | @CORS(allowHeaders = "X-PINGOTHER") |
| アクセス制御許可メソッド | @CORS(allowMethods = "OPTIONS,POST") |
| アクセス制御許可オリジン | @CORS(allowOrigin = "http://www.liferay.com") |
ここまでで、 これで、LiferayでJAX-RSウェブサービスを作成、デプロイ、呼び出す方法がわかりましたね!