RevComm Tech Blog

コミュニケーションを再発明し 人が人を想う社会を創る

AWS CognitoでSAML/OIDC SSOを汎用化する

概要

こんにちは、RevCommのエンジニア、加藤(涼)です。今回はMiitelでAWS CognitoでSAML/OIDC SSOを汎用化した件についてお話ししようと思います。

背景

MiitelではOIDCの認証プロトコルかつ、GoogleとMicrosoft Azureのプロバイダーを用いたSSOのみにしか対応していませんでした。しかし今回、お客様からのご要望に伴いSAMLプロトコルやその他のプロバイダーに対応することとなりました。まず各用語について確認していきたいと思います。

OIDC とは

OIDC (OpenID Connect)は、OAuth 2.0をベースにした認証プロトコルです。OAuth 2.0はRFC 6749にて規定されています。

OIDCの主な特徴は以下の通りです:

  • OAuth 2.0の認可フローに加えて、IDトークン(JWT)を使用したユーザー認証情報のやり取り
  • Claim(ユーザー属性情報)の標準化された取得方法を提供

Authorization Code Flow、Implicit Flow、Hybrid Flowなどの認証フローが規定されており、用途に応じて適切なフローを選択します。

SAML とは

SAML(Security Assertion Markup Language)は、XMLベースの標準規格で、組織間でユーザー認証情報を安全に交換するためのプロトコルです。主にエンタープライズ環境での Single Sign-On (SSO) に使用されます。SAMLはRFC 7522で規定されています。

SAMLの主な特徴は以下の通りです:

  • XMLベースのメッセージフォーマットを使用し、セキュリティアサーションを交換
  • IdP(Identity Provider)とSP(Service Provider)の間で認証情報を安全に伝送

SAMLでは、ユーザーがサービスにアクセスする際、IdPが認証を行い、認証結果をSPに対してXML形式のアサーションとして送信します。これにより、ユーザーは一度の認証で複数のサービスにアクセスすることが可能になります。

AWS Cognito とは

AWS Cognitoは、AWSが提供するユーザー認証・認可サービスです。Webアプリケーションやモバイルアプリケーションにおけるユーザー管理、認証、アクセス制御を実装することができます。

Miitelではユーザー管理にCognitoを利用しています。SAML/OIDCプロバイダーをユーザープールに設定することができるため、今回は自前で実装せず、その機能をメインで使うことにしました。

構成

before

課題を再確認します。

  1. GoogleとMicrosoft Azure のプロバイダーにしか対応していない。(DBやAPIでEnumでの管理)
  2. OIDC プロトコルのみ
  3. ユーザーがMiitel管理者にSSO設定依頼をする必要があった。

これらの問題の影響でSAMLでのご要望に応えられなかったり、SSOの設定に時間がかかり、ヒューマンエラーが発生することもありました。

After

上記の課題から

  1. ユーザのSSO設定フローを変更
  2. SAMLの設定を可能に
  3. GoogleとMicrosoft Azure以外のプロバイダーをサポート

するよう変更しました。

変更後のイメージはこのような感じです。

ユーザーはMiitel Admin上でSSOを自由に設定できるようになりました。

OIDC/SAMLおよびプロバイダーの種類に制限がなくなりました。

開発時の注意点

AWS Cognitoの1ユーザーにリンクされたID数は5つまで

開発時に陥ったエラーです。Cognitoでは1ユーザーに紐づくIDプロバイダーの数が5つまでに設定されています。

これはSSOログインをする度にユーザー属性のidentitiesにログインのプロバイダーが登録されていき、6つ目のプロバイダーではログインしようとするとできないようになっています。

実際6以上のプロバイダーを使うユーザーはほぼほぼいないのですが、開発時には何個も登録するためこのクォータに引っかかりました。

上記の解決方法ですがaws cognito-idp admin-disable-provider-for-user を使うことによりユーザーとSSOの連携を解除できます。

create/update-identity-providerのProviderDetailsオプションが複雑

ユーザープールにidentity providerを設定するにはcreate-identity-provider/update-identity-providerで可能です。

ただ、SAML, OIDCでパラメータが大きく異なります。

ProviderDetails というオプションがあるのですが、この中にSAMLとOIDCの詳細を全て追加します。OIDCはスネークケースのキー名なのに対し、SAMLはパスカルケースになっています。

https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-identity-provider.html

—saml-provider-details/—oidc-provider-details に名前を分けてほしいですね。

Screenshot 2025-02-04 at 10.15.46.png

まとめ

今回はMiitelでOIDC/SAMLプロトコルの両方に対応し、プロバイダーも複数選べるようになった件についてお話ししました。

認証方法については「ログイン・パスワード」・「Google」というのは良くみますが、SAMLプロトコルを用いたSSOにしか対応していないお客様も少なくありません。本記事が参考になれば幸いです。

以上、アカウントチームより、加藤がお話しさせていただきました。

参考