2.2.3. Cordova でのハイブリッドアプリケーション
Keycloak は、Apache Cordova で開発されたハイブリッドモバイルアプリをサポートしています。JavaScript アダプターには、cordova および cordova-native の 2 つのモードがあります。
デフォルトは cordova で、アダプターのタイプが設定されておらず、window.cordova が存在する場合は自動的に選択されます。ログインすると、ユーザーが Red Hat Single Sign-On を操作できる InApp ブラウザー が開き、その後 http://localhost リダイレクトしてアプリに戻ります。このため、管理コンソールのクライアント設定セクションでこの URL を有効な redirect-uri としてホワイトリスト化する必要があります。
このモードの設定は簡単ですが、いくつかの欠点もあります。
- InApp-Browser はアプリに組み込まれたブラウザーで、電話のデフォルトブラウザーではありません。したがって、設定が異なり、保存されている認証情報は利用できません。
- 特に複雑な内容をレンダリングする場合は、InApp-Browser も遅くなる可能性があります。
- このモードを使用する前に、アプリがログインページをレンダリングするブラウザーを完全に制御できるため、アプリがユーザーの資格情報にアクセスできる可能性があるなど、セキュリティ上の懸念事項を考慮する必要があります。そのため、信頼できないアプリの使用は許可しないでください。
この例のアプリ (https://github.com/keycloak/keycloak/tree/master/examples/cordova) で初めてみましょう。
代替モードの cordova-native は別のアプローチを取っています。システムのブラウザーを使用してログインページが開きます。ユーザーが認証されると、ブラウザーは特別な URL を使用してアプリにリダイレクトします。そこから、Red Hat Single Sign-On アダプターは、URL からコードまたはトークンを読み取り、ログインを終了できます。
init メソッドにアダプター型の cordova-native を渡すことで、ネイティブモードを有効できます。
keycloak.init({
adapter: 'cordova-native'
})
keycloak.init({
adapter: 'cordova-native'
})
このアダプターには、以下の 2 つのプラグインが必要です。
- cordova-plugin-browsertab: システムのブラウザーで Web ページを開くことができます。
- cordova-plugin-deeplinks: ブラウザーが特別な URL でアプリにリダイレクトできるようにします。
アプリへのリンクの技術情報は、各プラットフォームや特別な設定によって異なります。詳細は、deeplinks プラグインのドキュメント の Android と iOS のセクションを参照してください。
アプリを開くためのリンクにはさまざまな種類があります。カスタムスキーム (myapp://login または android-app://com.example.myapp/https/example.com/login) と ユニバーサルリンク (iOS)/Deep Links (Android) です。前者はセットアップが簡単で信頼性が高い傾向がありますが、後者は一意であり、ドメインの所有者のみが登録できるため、セキュリティーが強化されます。カスタム URL は iOS で非推奨になりました。最高の信頼性を得るには、ユニバーサルリンクをカスタム URL リンクのあるフォールバックサイトと組み合わせて使用することをお勧めします。
さらに、Keycloak アダプターとの互換性を改善するには、以下の手順が推奨されます。
-
iOS のユニバーサルリンクは、
response-modeをqueryに設定すると、より確実に動作するようです。 -
リダイレクト時に Android がアプリの新しいインスタンスを開かないようにするには、次のスニペットを
config.xmlに追加します。
<preference name="AndroidLaunchMode" value="singleTask" />
<preference name="AndroidLaunchMode" value="singleTask" />
ネイティブモードの使い方を示すアプリの例 (https://github.com/keycloak/keycloak/tree/master/examples/cordova-native) があります。