問題
- ポータルで SAML をアクティブ化した後、Mobile SDK を使用して開発されたアプリケーションは、次のエラーでログインに失敗します (ログインできませんでした ... Cookie が無効または空):
2021-05-27 11:00:18.818 17236-17236/my.custom.app E/LiferayScreens: Could not login com.liferay.mobile.android.exception.AuthenticationException: Cookie invalid or empty at com.liferay.mobile.android.auth.CookieSignIn.parseAuthToken(CookieSignIn.java:161) at com.liferay.mobile.android.auth.CookieSignIn.parseResponse(CookieSignIn.java:177) at com.liferay.mobile.android.auth.CookieSignIn.signIn(CookieSignIn.java:70) at com.liferay.mobile.screens.auth.login.interactor.LoginCookieInteractor.execute(LoginCookieInteractor.java:35) at com.liferay.mobile.screens.base.interactor.BaseInteractor$1.run(BaseInteractor.java:29) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923)2021-05-27 11:00:18.826 17236-17236/my.custom.app E/my.custom.app: Invalid ID 0x00000000.2021-05-27 11:00:18.846 17236-17236/my.custom.app D/my.custom.app.view.activity.LoginActivity: FAILURE LOGIN com.liferay.mobile.android.exception.AuthenticationException: Cookie invalid or empty at com.liferay.mobile.android.auth.CookieSignIn.parseAuthToken(CookieSignIn.java:161) at com.liferay.mobile.android.auth.CookieSignIn.parseResponse(CookieSignIn.java:177) at com.liferay.mobile.android.auth.CookieSignIn.signIn(CookieSignIn.java:70) at com.liferay.mobile.screens.auth.login.interactor.LoginCookieInteractor.execute(LoginCookieInteractor.java:35) at com.liferay.mobile.screens.base.interactor.BaseInteractor$1.run(BaseInteractor.java:29) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923)
Environment
- DXP7.0以上
解決策
- この場合の解決策は、OAuth2 ログイン メソッドを使用し、ログインのために IdP (ID プロバイダー) にリダイレクトし、成功すると SP (サービス プロバイダー) の役割を持つアプリケーションに戻ることです。
-
test-app アプリケーションで OAuth2 リダイレクトを行うフローは次のとおりです。
- LoginOAuth2RedirectInteractor.java#L32 で Mobile SDK メソッド signInWithRedirect から OAuth2SignIn.java#L45 を使用してページ Web ビューを開いてログインします。
- ブラウザーでは、ユーザーは IdP にログインするようにリダイレクトされます (実際には、SAML をアクティブ化した後にブラウザーで行われる通常のログイン フロー)。
- ログインが成功すると、OAuth2 アプリケーションがこの情報を処理できるように、承認が要求されます。
- パーミッションがあり、OAuth2 アプリケーションを承認すると、OAuth2SignIn.java L25の Mobile SDK resumeAuthorizationFlowWithIntent メソッドを呼び出すこの LoginOAuth2ResumeRedirectInteractor.java#L28 メソッドの応答を確認するために返されます。
- 応答は TokenRequester.java#L88 で検証され、すべてが成功した場合、ユーザーはこの時点で認証されます。
- これらすべてを機能させるには、次の手順に従って OAuth2 アプリケーションを構成する必要があります。
- コントロール パネル -> 設定 -> OAuth2 管理に移動します。
- プラス ボタン (+) Add OAuth2 application を使用して、 server_context.xml#L11 で使用する名前とコールバック URI を指定します ( AndroidManifest.xml#L69で、どれが自分のものに対応するかを識別する必要があります)。 残りはそのままです。 [保存] をクリックします。
- [Scopes] タブを開き、Portal Services で使用可能なすべてのオプションを選択します (これらはログインに必要ですが、必要に応じて他のオプションを追加できます)。
- OAuth 2 アプリケーションに戻り、右側の手順 1 で作成したアプリケーションで、3 つのドット アイコンのコンテキスト メニューをクリックし、[アクセス許可] オプションを選択します。
- デフォルトでは、管理者ユーザーにはすべての権限がありますが、他のユーザーがアプリケーションを承認できるようにするには、「トークンの作成」権限と「表示」権限が必要です。
- これで、ポータルで SAML がアクティブ化されたときに OAuth2 リダイレクトでログインを成功させるために必要なすべてが揃います。
追加情報
- このケースのテストに使用したアプリケーション: test-app
- SAML 構成のドキュメント: Liferay DXP idP および SP での SAML の展開と管理
- SAML アプリ: SAML 2.0 への Liferay コネクタ
- OAuth2 アプリ: OAuth 2.0 用の Liferay プラグイン
- Liferay Screens での Android のドキュメント: Android 認証コード pkce の Liferay Screens での OAuth 2 の使用
- Android Mobile SDK のドキュメント: Android Mobile SDK 認証コード pkce での OAuth 2 の使用
- Liferay Screens の iOS に関するドキュメント: iOS 認証コード pkce の Liferay Screens での OAuth 2 の使用
- iOS Mobile SDK のドキュメント: iOS Mobile SDK 認証コード pkce での OAuth 2 の使用