突然「スマホアプリも認証サーバと連携して」と言われたら
2022-06-10 - 星野 康
1. はじめに
上司やお客様から突然「スマホアプリも認証サーバ(Webベースのシングルサインオン系)と連携して」と言われた場合、どうしますか? まずはWeb上で情報を探す、、、としても、シングルサインオンの分野はアプリ開発自体に比べると関わっている人が少なく、情報が中々見つけづらいものかなと思います。
というところで本記事では、おすすめ実現案やら試してみた結果やらを書いてみます。 もし記事をお読みくださったら、認証系製品(認証サーバ&クライアント側モジュール製品)のベンダ候補として、弊社(OSSTech株式会社)も加えていただけますと嬉しいです。
2. おすすめ実現案
さて、、どんな感じでスマホアプリでも認証サーバと認証連携できるようにしましょうか。
多くの場合、認証サーバ(シングルサインオンサーバ)は、複雑&多様な認証を実施できるようなWebインタフェースを用意してくれてます。そして、スマホの方ではアプリ本体とブラウザとを連携する仕組みがあります。これら状況を踏まえ、『アプリ本体とブラウザとを連携させ、ブラウザから先は普通のWebアプリの認証連携と同じにする』という実現案をおすすめします。 (凄く凄く頑張れば、スマホアプリのコード内にて認証画面を実現して認証サーバとの通信を制御して…、なんてこともできるのかも知れませんが。。コスト的にもセキュリティ的にも、そちらはお勧めしません。)
『スマホアプリとブラウザとを連携させ、ブラウザから先は普通のWebアプリの認証連携と同じにする』を図にすると、以下のようなイメージです。なお、弊社(OSSTech株式会社)で扱っている製品名も例示しています;-)
そもそも普通のWebアプリの認証連携とは…?については、過去記事群(特にこちら)にて記していますので、必要に応じてお読みいただければ幸いでございます。
3. 試してみた
理屈としては上記のような案で実現可能、、とは思いつつ実際試してみたことはなかったので、今回試してみました。 スマホ上でのアプリ/ブラウザ連携にはいくつか方法があるようなので、いくつかメジャーなパターンと思われるものをピックアップして試してみます。結果はこんな感じです。
# | 試したパターン | FIDO2/WebAuthn対応 | ブラウザからアプリへの戻り方 | 備考 |
---|---|---|---|---|
1 | iOS x アプリ"上"ブラウザ(WKWebView) | × | プログラム制御も可能 | |
2 | iOS x アプリ"上"ブラウザ(SFSafariViewController) | 〇 | Universal Linksが必要 | |
3 | iOS x アプリ"外"ブラウザ(Safari) | 〇 | Universal Linksが必要 | |
4 | Android x アプリ"上"ブラウザ(WebView) | × | プログラム制御も可能 | もうあまり開発されてないようなので、基本的にWebViewではなくCustom Tabs使ったほうが良さそう |
5 | Android x アプリ"上"ブラウザ(Custom Tabs/Chrome) | 〇 | App Linksが必要 | |
6 | Android x アプリ"外"ブラウザ(Chrome) | 〇 | App Linksが必要 |
ざっくり纏めるとこんな感じ。
- 最新の規格化された認証方式「FIDO2/WebAuthn」を利用したい場合、適切なパターンを選ぶ必要がある。
- その場合、ブラウザからアプリへ戻る方法として、iOSならば Universal Links を、Androidであれば App Links を利用する必要がある。(Deep Linkはセキュリティ面の懸念があるのでもう使うべきではありません。)
上記の通り、アプリ"上"ブラウザでもアプリ"外"ブラウザでも実現はできるのですが、、、個人的にはアプリ"外"の方をお勧めします。 理由としては、アプリ"上"ブラウザの方はデザインや制御について検討・対応しないといけなかったり、ブラウザ部品の仕様追加や変更などあった場合に追従するのが大変そうなので。あと、アプリ"外"ブラウザにすると普通のWebアプリとCookie領域が同じになるのでシングルサインオンになる、という利点もあったりします。
4. おわりに
というわけで、スマホアプリを認証サーバと連携するためのお勧め実現案と、実際に実現を試してみた結果を記してみました。結論としては、
- お勧め実現案は『アプリ本体とブラウザとを連携させ、ブラウザから先は普通のWebアプリの認証連携と同じにする』
- アプリ/ブラウザ連携の方法は複数パターン考えられるけど、お勧めは『アプリ"外"ブラウザとの連携』
でした。