3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS Cognitoを使用したSSO実装

Posted at

業務でSSO開発を行ったので、備忘録。

対象者

  • Cognitoを使用してSSO連携したい人
  • SAML認証を使用してSSO連携したい人
  • IdPを簡潔に設定してSSO連携の動きを知りたい人

SSOとは

Single Sign-Onの略で、ユーザーが複数のサービスに一度のログインでアクセスできるようにする技術です。これにより、ユーザーエクスペリエンスが向上し、パスワード管理のオーバーヘッドも削減されます。

SAMLとは

Security Assertion Markup Languageの略で、SSOのためのXMLベースのオープンスタンダードです。SAMLは、異なるドメイン間での認証と承認データの交換を可能にします。

AWS Cognitoとは

Amazon Web Services (AWS) が提供する認証・認可サービスです。Cognitoを使用すると、Webアプリケーションやモバイルアプリケーションに簡単にユーザー管理と認証機能を追加することができます。

実装の流れ

今回は下図を構築していきます。App部分は後日時間があれば別記事にします。
SAML IdPはKeycloakを使用しています。オープンソースのアイデンティティ・アクセス管理ソフトウェアなのでローカル環境で構築できます。

  1. Cognito設定(ユーザープール作成)
  2. IdP設定(Keycloak構築)
  3. Cognitoのアプリケーションクライアント構築
  4. 動作確認(Cognito アプリケーションクライアントのホストされたUIから確認)

スクリーンショット 2023-09-24 22.01.56.png

構築

Cognito設定

AWSマネコン > AWS Cognito > ユーザープール作成

ユーザープール作成

SSO連携させたいので「フェデレーテッドアイデンティティプロバイダー」チェック
スクリーンショット 2023-09-24 20.57.24.png
SSO連携時のマッピングをemailで行うので「Eメール」チェック
フェデレーティッドサインインのオプション:SAML

スクリーンショット 2023-09-24 20.57.34.png

この辺は適宜設定してください。(今回に影響なし)
パスワードポリシー:Cognitoのデフォルト
スクリーンショット 2023-09-24 20.58.30.png

MFAなし
スクリーンショット 2023-09-24 20.58.44.png
スクリーンショット 2023-09-24 20.59.11.png
スクリーンショット 2023-09-24 20.59.28.png

「CognitoでEメールを送信」チェック
スクリーンショット 2023-09-24 21.00.11.png

IdP(keycloak)設定後に設定するので「後で」クリック
スクリーンショット 2023-09-24 23.52.04.png

ユーザープール名:任意の値
スクリーンショット 2023-09-24 21.01.44.png

ドメイン名はSSO連携で必要になるため「Cognitoドメインを使用する」にチェック
ドメイン名は任意の値
スクリーンショット 2023-09-24 21.04.14.png

「パブリッククライアント」チェック
アプリケーションクライアント名:任意の値
クライアントのシークレットを生成しない:チェック
許可されているコールバックURL:https://jwt.io →後から説明します。
スクリーンショット 2023-09-24 21.04.48.png
スクリーンショット 2023-09-24 21.05.36.png

作成できました!!ユーザープールIDはkeycloak設定で使用します。
スクリーンショット 2023-09-24 21.06.53.png

IdP設定(Keycloak構築)

前提:dockerをローカルPCに構築済
今回IdPはローカル環境内に構築していきます。Dockerを使用するので各自構築お願いします。

docker-compose.yaml

version: '3'
services:
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    container_name: keycloak
    tty: true
    stdin_open: true
    ports:
      - "18080:8080" # 8080は被りやすいので別のポートに設定
    volumes:
      - .keycloak:/opt/keycloak/data # DB情報等が格納されます
    environment:
      KEYCLOAK_ADMIN: admin # 管理ユーザーIDを設定
      KEYCLOAK_ADMIN_PASSWORD: admin # 管理ユーザーのパスワードを設定
    command:
      - start-dev --http-relative-path /auth # 開発モードで起動

Docker起動

$ docker-compose up -d

Keycloak起動
ブラウザで「 http://localhost:18080/auth/ 」入力。以下のように表示されたら成功!!
スクリーンショット 2023-09-24 20.53.05.png

今からKeycloakの設定を行なっていきます。
Keycloakの細かい内容を知りたい場合は公式ドキュメントを読んでください。
https://keycloak-documentation.openstandia.jp/

IdP側の設定

  • レルム作成(多分テナント単位みたいなもの)
  • レルムのロール作成
  • クライアント作成(今回はCognito側の情報設定)
  • IdP内にユーザー追加

「Administration Console >」クリック → Dockerファイルで設定した、ユーザー、PWを入力
スクリーンショット 2023-09-24 20.53.05.png

レルム作成
サイドメニュー「master」クリック→「Create Realm」クリック
スクリーンショット 2023-09-24 20.53.31.png
Realm name 「Test」入力、「Create」クリック
スクリーンショット 2023-09-24 20.54.07.png
サイドメニューから「Realm roles」クリック、「Create role」クリック
スクリーンショット 2023-09-24 20.54.41.png
「Role name」に「Test-role」入力、「Save」クリック
スクリーンショット 2023-09-24 20.55.05.png
サイドメニューから「Clients」クリック、「Create client」クリック
スクリーンショット 2023-09-24 20.55.26.png

下記設定:
Client Type: SAML
Client ID: urn:amazon:cognito:sp:<ユーザープールID>
※ユーザープールIDは各自作成したユーザープールで確認
スクリーンショット 2023-09-24 21.08.14.png

IdP(Keycloak)は、SAMLアサーションを使用して、このエンドポイントにユーザーをリダイレクトするので以下の設定が必要です。
Keycloak側でCognitoの帰り先を設定するイメージ。
Valid redirect URIs:
https://< yourDomainPrefix >.auth.< region >.amazoncognito.com/saml2/idpresponse

※以下公式ドキュメント参考:https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-saml-idp.html

「Save」クリック
スクリーンショット 2023-09-24 21.11.25.png

今回クライアント署名は必要ないため、OFFにします。
「Keys」タブ、「Client signature required」OFF
スクリーンショット 2023-09-24 21.12.11.png

Service ProviderであるCognitoとIdp(Keycloak)をマッピングしていきます。
「Client scopes」タブから作成したクライアントをクリック、「Configure a new mapper」クリック
スクリーンショット 2023-09-24 21.12.44.png
スクリーンショット 2023-09-24 21.12.59.png

「User Property」クリック
スクリーンショット 2023-09-24 21.13.14.png

Cognitoユーザープールでemailをサインインオプションに設定しているため
下記設定後、「Save」クリック
Name:email
Property:email
Fiendly name: email
SAML Attribute Name: email
スクリーンショット 2023-09-24 21.13.56.png

サイドメニュー「Clients」から「Clients list」タブクリック、先ほど設定したリストをクリック
スクリーンショット 2023-09-24 21.14.18.png

SAML設定で認証連携を行うにはユーザーの識別子を連携する必要があります。
同じユーザーを表す際に永続的に同じ識別子が使われる場合、「persistent」となります。

Name ID format:persistent
Force name ID format:ON
スクリーンショット 2023-09-24 21.16.16.png

サイドメニュー「Realm setting」クリック、「Requlre SSL」:Noneに設定
スクリーンショット 2023-09-24 21.17.01.png

「SAML 2.0 Identity Provider Metadata 」をクリック、xmlファイルとしてローカルに保存しておきます。
後ほどCognito設定時にメタデータをアップロードする時に使用します。
スクリーンショット 2023-09-24 21.17.27.png

ユーザー追加
サイドメニュー「Users」クリック、「Add user」クリック、以下設定後「Create」クリック

Username:test_keycloak
Email:任意の値
スクリーンショット 2023-09-24 23.29.07.png

「Credentials」タブクリック、「Set password」クリック
スクリーンショット 2023-09-24 21.20.11.png
任意のパスワード設定、Temporary:Offで「Save」クリック
スクリーンショット 2023-09-24 21.20.32.png

ユーザーに対して、ロールをマッピングしていきます。
サイドメニュー「Users」クリック、「Role mapping」タブクリック、「Assign role」クリック
スクリーンショット 2023-09-24 21.21.13.png

先ほど作成したロール「Test-role」を選択し、「Assign」クリック
スクリーンショット 2023-09-24 21.21.29.png

keycloakの設定は以上です(長いですね。。。)
再度Cognito設定をしていきます。

アプリケーションクライアントの設定

先ほど作成したユーザープールを選択してください。
IdPの設定を行なっていきます。

「サインインエクスペリエンス」タブクリック、「アイデンティティプロバイダーを追加」クリック
スクリーンショット 2023-09-24 21.21.49.png
「SAML」チェック
スクリーンショット 2023-09-24 21.22.00.png
メタデータドキュメントをアップロードで先ほどKeycloakでローカルに保存したxmlファイルをアップロード
スクリーンショット 2023-09-24 21.22.30.png
SAML属性:email
スクリーンショット 2023-09-24 21.22.53.png

「アプリケーションの統合」タブクリック、作成したアプリケーションクライアントクリック
スクリーンショット 2023-09-24 21.23.15.png

スクリーンショット 2023-09-25 0.00.51.png

許可されているコールバックURL:https://jwt.io

スクリーンショット 2023-09-25 0.01.19.png

IDプロバイダーに先ほど作成したIDプロバイダーを追加、保存
OAuth2.0許可タイプは今回「暗黙的な付与」にしています。
本来は「認可コード付与」を選択するのですが、リダイレクトされたhttps://jwt.io でアクセストークンの確認をしたいので設定しています。
スクリーンショット 2023-09-25 0.01.05.png

動作確認

AWSマネコン > Amazon Cognito > ユーザープール > アプリケーションの統合 > ホストされたUIで「ホストされたUIを表示」クリック
スクリーンショット 2023-09-25 0.00.51.png

「Keycloak」クリック
スクリーンショット 2023-09-25 0.03.56.png

keycloakのログイン画面に飛びます。emailとPasswordを入力
スクリーンショット 2023-09-25 0.04.01.png

ログインが成功すれば、許可されているコールバックURL:https://jwt.io で設定した画面に飛びます。
今回リダイレクトする際に、アクセストークンが付与されます。jwt.ioのサイトでは、渡ってきたアクセストークン(jwt)をパースして表示してくれます。
スクリーンショット 2023-09-25 0.25.38.png

最後に

AWS CognitoとKeycloakを組み合わせて、SAMLベースのSSOを簡単に実装することができます。 初めてSSO連携を取り込む方はローカルで確認できるのでぜひやってみてください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?