この記事は、Liferay DXP 7.x を2つのSSOプロトコル(SAML 2.0 を使用する Okta と Google OpenID Connect)で動作するサービスプロバイダとして設定する方法について説明しています。 基本的な設定はLiferay内ですぐに実現できますが、完全に機能させるためには追加のカスタムコードが必要です。 今回は、その両方の側面から解説します。
基本設定
Okta - SAML 2.0を使用したLiferayの統合
アイデンティティ・プロバイダーとしてOkta、サービス・プロバイダーとしてLiferay DXPを提供します。
ステップ1 - Oktaアカウント作成
- このリンクをクリックして、Oktaのテストアカウントを作成します https://developer.okta.com/signup/. Oktaのウェブサイトに移動します。
- 必要事項を入力すると、入力されたメールアドレスにOkta開発者アカウント有効化のお知らせが届きます。 Activate your account をクリックすると、アカウントが有効になり、Okta developer consoleにナビゲートされます。
ステップ2 - Oktaでのアプリケーションの作成
- 左メニューの「 アプリケーション」をクリック -> アプリケーション > アプリ統合の作成 > SAML 2.0の確認 (SAMLを利用して統合するので)
- Edit SAML integration が出てくる。 一般設定で、アプリ名を入力し、アプリケーションに表示する場合はロゴをアップロードし、ユースケースに基づいてアプリの可視性を確認し、 次へをクリックします。
- これにより、「Configure SAML」ページに移動します。 以下は、設定する必要がある重要な項目です。
- Show Advanced Settings をクリックし、ニーズに合わせて設定を選択します。
- 属性の設定 は、ユーザー同期が必要になるまで必要ありません。 その場合、IdPからSPにユーザーをインポートするために、Liferayが必要とする属性を設定する必要があります。
- 残りの設定はそのままにして、 次へをクリックします。
- フィードバックで、オプションの2番目のチェックボックス お客様またはパートナー様ですか を選択し、 完了をクリックします。
- Finishをクリックすると、IdPs側(Okta)のService Provider(Liferay)設定が正常に完了します。 あとは、IdPのEntity IDとMetadataを取得して、SP側で設定する必要があります。 同じものを得るには、 Application に移動し、作成したアプリケーション(Liferay)をクリックし、Sign-On オプションに移動してください。
- View Setup instructions をクリックすると、メタデータがダウンロードされ、Entity ID が表示されます。
- Identity Provider Issuer は Entity ID で、Liferay Identity Provider の接続にアップロードするために、メタデータをコピーして metadata.xml として保存してください。 これでアプリケーションの作成は完了です。
ステップ3 - Oktaでのユーザー作成
- ディレクトリ > 人物 > をクリックし、 人物の追加をクリックします。
- 詳細を入力すると、それぞれのメールアドレスにアカウント作成のためのアクティベーションが通知されます。
- Activate Okta Account をクリックすると、アカウントが作成されます。 アカウントの作成に成功したら、Okta内に作成したアプリケーション(Liferay)にそれぞれのユーザーを割り当てる必要があります。
- 同じことを行うには、それぞれのユーザーをクリックし、 Assign Application をクリックすると、ユーザーをそれぞれのアプリケーションに割り当てることができます。
ステップ4 - Liferayの設定
- Liferay DXP 7.3 バンドル(バニラ)を起動します。
- Control Panel > Security > SAML Admin > General にアクセスし、 SAML Role を Service Providerに、 Entity ID を liferayspに設定する。
- 証明書を作成します。
- Service Provider タブでは、デフォルトの設定のままにしておきます。
- Identity Provider Connection タブで、以下を設定します。(Oktaのメタデータファイルを忘れずにアップロードしてください。)
- General タブに戻り、Service Providerを有効にします。
- ホームページにサインインポートレットを追加する(SSOが機能しない場合、管理者はSSOをバイパスしてポータルにサインインすることができます)。
- 新しいブラウザを開き、右上の「 Sign-In 」をクリックすると、Oktaのサインインページにリダイレクトされます。
- ユーザー名とパスワードを入力します。
- ユーザーはLiferayのホームページに戻り、自動的にサインインします。
Google OpenID Connect
ステップ1 - Liferay DXPをOAuth 2.0クライアントとしてGoogle APIに登録する
- https://console.developers.google.comへ
- プロジェクトが存在しない場合は、プロジェクトを作成します。
- https://developers.google.com/identity/protocols/oauth2/web-server#creatingcredのドキュメントを参照してください。 以下に例を示します。
- Create credentials > OAuth client IDをクリックします。
- 指定する 認可されたリダイレクト URI あなたのアプリケーションのために https://www.sp.com:8443/c/portal/login/openidconnect
- Googleプラットフォームが生成したOAuth認証情報(client_idとclient_secret)を取得します。
ステップ2 - Liferayの設定
- OpenID Connectプロバイダー接続の構成:
- コントロールパネル > 設定 > システム設定 > セキュリティ > SSO にアクセスし、システムスコープで OpenID Connect Provider を選択し、以下の手順を実行します。
- 追加ボタンをクリックしてプロバイダーを追加します。
- プロバイダーから受け取った情報を使って、フォームに記入してください。
- プロバイダー名。この名前は、ユーザーがOpenID Connectを使用してログインするときに、サインインポートレットに表示されます。
- OpenIDクライアントID。プロバイダから受け取ったOAuth 2.0クライアントIDを記入します。
- OpenID Connect Client Secret: プロバイダから受け取ったOAuth 2.0クライアントシークレットを入力します。
- ディスカバリーエンドポイント。残りのURLはこのエンドポイントを通じて取得される。 OpenID Connect Providerから発信されています。 例:
https://accounts.google.com/.well-known/openid-configuration
- コントロールパネル > 設定 > システム設定 > セキュリティ > SSO にアクセスし、システムスコープで OpenID Connect Provider を選択し、以下の手順を実行します。
- DXPでのOpenID Connect認証の有効化
- コントロールパネル > 設定 > システム設定 > セキュリティ > SSO にアクセスし、 OpenID Connect 仮想インスタンススコープを選択します。
- Enabled チェックボックスをクリックし、 Saveをクリックします。
注: コントロールパネル → 設定 → インスタンス設定 → OpenID Connect タブで、指定した仮想インスタンスの OpenID Connect 認証を有効にすることも可能です。
- お客様のポータルサイト(例:https://www.sp.com:8443)にアクセスします。
- ホームページのサインインポートレットで、 OpenID Connect のリンクをクリックします。
- デフォルトのGoogle OIDCがリストに入っています
- サインインボタンをクリックすると、Googleのサインインページが表示されます。
- 通常通り、認証情報を入力します
- ログインに成功すると、トップページに戻るはずです。
推奨されるカスタムコード
課題
- ゲストとしてプライベートページをリクエストすると、常にSAMLログインとなる
- 以前OIDCで認証されたユーザー(例えば期限切れのセッションなど)は、SAMLログインを経由します。
- より一般的には、/c/portal/login へのリクエストはすべて SAML を介して行われる。
- SAMLが有効な場合のログインポートレットのレンダリングには、いくつかの修正が必要です。
ソリューション
com.liferay.saml.runtime.servlet.profile.SamlSpIdpConnectionsProfile#isEnabled
を @Component で実装します。 LoginAction (/c/portal/login) が呼ばれるたびに呼び出され、HttpServletRequestオブジェクトとともに提供されます。 これは、構成された SAML IDP 接続 (これも提供される) ごとに 1 回呼び出される。 すべての呼び出しが false を返した場合、通常のログインポータルがレンダリングされる。 SAML Adminの「Service Provider」タブでこれを有効にしている限りは。
SAMLかSAMLでないかの判断が、スタッフかスタッフでないかに基づいている場合は、これで十分かもしれない。 なぜなら、スタッフのリクエストは、既知のサブネットから来る可能性が高いからです。 あるいは、フロント・ウェブサーバーがHTTPリクエストに何らかのタグを付けることができるかもしれません(例えば、ヘッダーなど)。
ユーザごとの制御が必要な場合は、ログインポートレットで SAML ログインができるようにするのもよい方法です。 そのために com.liferay.saml.runtime.servlet.profile.SamlSpIdpConnectionsProfile#isEnabled
特別な "useSAML" (任意の名前の)HTTPリクエストパラメータが存在しないときは常にfalseを返すようにすることができました。
これにより、ログインポートレットは常にレンダリングされるようになり、OpenId Connectが行う方法と同様に、DynamicIncludeを登録して「SAML」リンクを追加することができる。 このリンクは、/c/portal/login?useSAMLにする必要があります。 クリックすると、SAML IdP へのリダイレクトが発生するか、複数の SAML IdP が利用可能な場合は、ユーザに SAML IdP の選択が提示される。
ログアウトも問題なく動作する。これは、SAML IdP からログアウトを要求する前に、アクティブな SAML SP セッションがあるかどうかを確認するためである。