背景
複数アプリケーションにまたいで同一ID・パスワードで認証させるという要件は昨今、多くの企業で求められる要件です。このような要件に対して、クラウドサービス、とくに認証を司るクラウドサービスであるIDaaSを活用することが多くあります。代表的なサービスとして、AWS Cognito、Okta CIC(Auth0)、Azure EntraIDなどがありますが、今回はAWS Cognitoを活用した場合に、どのような実装をする必要があるかをご説明します。(最後にご紹介いたしますが、TC3が提供する「Tactna」をご利用いただくと今回想定されるケースのような複雑なケースの要件を満たし、実装を回避できることが可能です)
4つの技術要件
今回は、TC3が多くエンタープライズアプリケーション開発を経験する中で、AWS Cognitoを認証IdPとして満たすべき要件を以下と想定して考えます。
- ログインUIのフルカスタマイズ:これまでの弊社案件からエンタープライズ向けのログインページは完全に独自デザインを要求されるため、ログインUIのフルカスタマイズを可能とします。
- 複数アプリケーション (Client) のシングルサインオン:IDaaSはエンタープライズが管理する複数アプリケーションにおいて、1回のログインで全てのアプリケーションの認証とするシングルサインオン (SSO) を実現します。
- OIDC/OAuth2.0:OpenID Connect (OIDC) と OAuth 2.0 は、現在の認証と認可におけるデファクトスタンダードとなっており、ほとんど全てのIdPがこのプロトコルに対応しています。OAuthの概要についてはこちらをご確認ください。
- Token Claimsのカスタマイズ:OIDC/OAuth2.0の認証後、認証情報としてTokenがクライアントアプリケーションに発行されますが、アプリケーション固有またはユーザー情報をTokenに独自Claimとして追加可能とします。
AWS CognitoではCognito API / AmplifyとOIDCの2種類の認証方式が存在します。以下に今回の要件への対応可否について整理します。
認証方式 | ログインUI | SSO | Token カスタマイズ | 認証API |
Cognito API / Amplify | ⭕️ アプリケーションで 実装(フルカスタマイズ可能) | ❌ 同一Clientのみ可能 | 🔺 Lambda実装が必要 | ⭕️ 公開 |
OIDC | ❌ Cognito OIDC UI (非常に限定的なカスタマイズ) | ⭕️ 複数Clientで可能 | 🔺 Lambda実装が必要 | ❌ 非公開 (OIDCは公開) |
上記の通りAWS Cognitoが提供する認証方式のみでは、どちらかの方式を選択すると目標となるなんらかの要件を満たすことが出来ません。
したがって、今回上げた4つの要件にすべて対応させるためにはAWS Cognitoを認証IdPとした独自のOIDC/OAuth2サーバーを実装する必要があります。
Cognitoと独自ODIC/OAuth2での実装方法
(1) 認証/認可フローの設計
Tactna OIDC/OAuth2の認証/認可の流れとしては以下のようになります。
- ユーザーがアプリケーションの何らかの認証が必要なページにアクセスする、またはログインボタンを押下する。
- アプリケーションはTactnaのOIDCサーバーへ認証要求を行い、Cognitoに対するログインページが表示される。
- ユーザーは認証情報を入力しログインを行う。
- 認証情報が正しければ、OIDCの認証コードと共にアプリケーションに戻る (リダイレクトする) 。
- アプリケーションは認証コードをもとにID、AccessとRefresh TokenをOIDCサーバーから取得する。
- アプリケーションはAcess Tokenをリソースサーバーに送りユーザーデータをリクエストする。
- リソースサーバーはAccess Tokenを検証し、正しい場合はユーザーデータを返却する。
- アプリケーションは取得したユーザーデータを表示する。
実際のリクエストをシーケンス図で表すと以下のようになります。
(2)参考ドキュメントなど
OIDC/OAuth2.0関連:
セキュアなOIDC/OAuth2.0サーバー構築のためにはRFCの理解が必要となります。
- OIDC: https://openid.net/specs/openid-connect-core-1_0.html
- OAuth 2.0: https://datatracker.ietf.org/doc/html/rfc6749
- JWT: https://datatracker.ietf.org/doc/html/rfc7519
AWS関連:
Cognitoをセキュアに実装する必要があります。OIDCサーバーはAWS Lambdaで構築しました。
- Cognito: https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html
- Lambda: https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html
- AWS Security: https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/welcome.html
セキュリティ関連:
その他セキュリティ観点では、OWASPのチートシートなども参考にしました。
- OWASP:
まとめ
今回は非常にコンパクトにブログ記事をまとめさせていただきましたが、ご紹介した内容以外にも様々な考慮ポイントがあり、かつOIDC/OAuth2の仕様ドキュメントやAWS Cognitoの仕様ドキュメントなどを確認しながら設計していくため、かなりの労力がいる作業になります。
今回の内容は、2024年5月末に発表したTC3のアイデンティティ管理+αのサービスである「Tactna」でも一部実装しており、TC3社内でもナレッジが蓄積されています。Tactnaをご利用いただくことで、今回ご紹介したような認証認可における要件を満たすうえでのいくつかの技術課題をショートカットすることが可能です。是非冒頭のような要件がある場合にはTC3までお問い合わせください。
ソリューションサービスのご紹介
TC3はOkta CIC(Customer Identity Cloud)を代表とするIDaaSを活用したデジタルサービス開発のプロフェッショナルです(Customer Identity Cloudの認定も取得しています)。
すでに実践的に設計・実装された基盤サービスとして2024年5月末に、「Tactna Identity Platform」を発表しました!このサービスを活用いただくことで、事業部やサービス間の調整を減らし、リリースまでの期間を早め、ユーザー体験を向上させるといったメリットの多い開発プランをご提供します。
トライアル・MVP開発の段階から、どのようにIDaaS/CIAMを導入するかについてもサポートさせていただきますので、お気軽にお問い合わせください。
Tactna Identity Platformに関する詳細のご紹介資料は以下からダウンロードいただけます!
ひとまず情報のキャッチアップだけしておきたいという方は、こちらからニュースレターの購読ができます。