はじめに
外部IdPとAmazon CognitoをSAMLで連携させてみます。
参考動画はこちら How to add Okta as a SAML Identity Provider in AWS Cognito?
また参考Webはこちら。OktaとAWS Cognito連携 ~SAML編~
内容はこの通りの「やってみた記事」ですが、OktaもAmazon Cognitoも画面デザインが変わっているので読み替えが大変でした。
大変参考になりました。ありがとうございます。
Amazon Cognito設定①
ユーザープールを作成
AWS マネージドコンソール > Amazon Cognito > ユーザープール > ユーザープールを作成
※テストに使用したユーザープールがあるのでマスクしてあります。
アプリケーションタイプ:シングルページアプリケーション(SPA)
※ 「従来のウェブアプリケーション」で作成されるクライアントシークレットがあると動作しないかも?
アプリケーションに名前を付ける:userpool-SAML(※お好きな名前をどうぞ)
サインイン識別子のオプション:☑ユーザー名
サインアップのための必須属性:email (識別子にユーザー名を選ぶときは、emailの選択は必須とのこと)
リターンURL:https://jwt.io (認証成功後、Oktaから返されたトークンの内容を調べられるサイトにリダイレクトさせます)
->ページ下の「ユーザーディレクトリを作成する」ボタンをクリック
ページ下の「概要に移動」ボタンをクリック
ユーザープールの名前変更
「概要」ページが開くと、ユーザープール名が「User pool - (ランダム)」になっているので、修正します。
「名前変更」をクリック
セルフサービスのサインアップ >自己登録を無効化
左側の機能一覧から、
認証 > サインアップ > セルフサービスのサインアップ > 編集 ボタンをクリック
□自己登録を有効化 ※チェックを外す
変更を保存 ボタンをクリック
Oktaの設定
Oktaアカウント登録
okta Developerでアカウントを登録します。
※Gmailなどのフリーメールで新しいアカウントを登録しようとすると、ビジネス用メールアドレスで登録するようメッセージが表示されました。
私はGitHub認証で登録しましたが、Googleアカウント認証や、登録するなら会社のメールアドレスで登録するのが良いでしょう。
MFAの登録などが必要になるので、進めてください。
ユーザー登録
SAML認証を行うユーザーを登録します。
ディレクトリ > ユーザー > ユーザーを追加 ボタンをクリックします。
ユーザー情報を入力して「保存」ボタンを押します。
ユーザーが登録されました。
このあと作成するアプリに登録するユーザーには管理者が必要とのことなので、今作成したユーザーを管理者にします。
※管理者ロールが無くても動作することもあり、本当に必要かは追加検証の必要あり
作成したユーザー名をクリック > 管理者ロール(タブ) > 個人の管理者権限を追加
「ロール」から「Organization管理者」を選択して、「変更を保存」をクリックします。
※テストなので強めの権限を当てています。
アプリ統合を作成
左側のリストから、アプリケーション > アプリケーション > アプリ統合を作成 ボタンをクリックします。
●SAML 2.0 にチェックを入れ、「次へ」ボタンをクリックします。
アプリ登録
アプリ名:okta-sso-saml (※お好きな名前を入力)
アプリ名設定 シングルサインオンURL:
CognitoがOktaからの認証レスポンスを受け取るためのURL。Cognitoがユーザープール毎に用意してくれている。下記URLの書式で指定する。
自分のCognitoドメイン/saml2/idpresponse
例: https://ap-northeast-1hnn2w28xx.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse
※Cognitoドメインは、Cognitoのマネジメントコンソール「ブランディング > ドメイン」から確認します。
- オーディエンスURI:
urn:amazon:cognito:sp:ユーザープール ID
例: urn:amazon:cognito:sp:ap-northeast-1_hNn2W28xx
※ユーザープールIDは、Cognitoのマネジメントコンソール「概要」にて確認します。
「シングルサインインURL]と「オーディエンスURI」を入力した画面はこちら
- 属性ステートメント(オプション)
OktaからCognitoに引き渡すユーザー属性を設定します。 (下記は一例) 「値」はプルダウンに表示されるものは選択し、表示されないものは手入力します。
設定後「次へ」をボタンをクリックします。
Name | Value |
---|---|
firstname | user.firstName |
lastname | user.lastName |
displayname | user.displayName |
nickname | user.nickName |
user.email |
※Name: OktaとCognitoで共通に認識するキー
※Value: Oktaのユーザー情報に含まれる値
- フィートバック
Oktaのアンケートのようなので、下記にチェックを入れます(どちらでもよさそう)
☑ SAMLを有効にするには、ベンダーに問い合わせる必要があります
チェック後、画面下の「終了」ボタンをクリックします。
ユーザーをアサイン
SAML認証を行うユーザーをアサインします。
アプリケーション > okta-sso-saml > 割り当て(タブ) > 割り当て ボタン > ユーザーに割り当て をクリック
SAML認証を行いたいユーザーの右側の「割り当て」をクリックします。
ユーザー名(メールアドレス)を確認して、「保存して戻る」をクリックします。
ユーザーが「割り当て済み」になっているのを確認して、「完了」をクリックします。
メタデータを取得
Oktaの登録情報(メタデータ)を取得して、Cognitoにアップロードします。
サインオン タブをクリックし、画面下の「SAML署名証明書」を表示します。
ステータスが「アクティブ」になっている方の「アクション」をクリックし、「IdPメタデータを表示」をクリックします。
ブラウザの別タブでXMLが表示されるので、ローカルPCに保存します。
ファイル名は「metadata.xml」などにします。
Amazon Cognito設定②
Amazon Cognitoのマネージメントコンソールを開きます。
左側のリストから、認証 > ソーシャルプロバイダーと外部プロバイダー > アイデンティティプロバイダーを追加 ボタンをクリックします。
プロバイダー名:okta-saml (お好きな名前を入力してください)
識別子 - オプション:okta-saml (お好きな名前を入力してください)
プロバイダー名と識別子 メタデータドキュメント:「ファイルを選択」ボタンをクリックして、先ほど保存したXMLファイルをアップロードします。
メタデータドキュメント(XMLファイル)のアップロード SAMLプロバイダーとユーザ―プールの間で属性をマッピング Oktaの「属性ステートメント(オプション)」で設定したユーザー属性とのマッピングを設定します。
ユーザ―プール属性:プルダウンから選択
SAML属性:Oktaの「属性ステートメント」の「値」で設定した値を入力。
入力がすんだら「アイデンティティプロバイダーを追加」ボタンをクリックします。
ユーザープール属性 | SAML属性 |
---|---|
given_name | firstname |
family_name | lastname |
name | displayname |
nickname | nickname |
アプリケーションクライアント の設定
左側の機能一覧から、アプリケーション > アプリケーションクライアント > userpool-SAML をクリック
ログインページ タブをクリック
ログインページ タブ 編集 ボタンをクリック
編集 IDプロバイダー:
☑ okta-saml (チェックを入れます)
□ Cognitoユーザ―プール (チェックを外します)
IDプロバイダー OAuth 2.0許可タイプ
☑ 暗黙的な付与 (チェックを入れます)
□ 認証コード付与 (チェックを外します)
OAuth 2.0 許可タイプ OpenID Connect のスコープ
☑ OpenID のみチェックを付け、他のチェックを外します。
OpenID Connect のスコープ 上記3か所の設定を確認し、「変更を保存」ボタンをクリックします。
変更を保存
ログインページを開く
「ログインページを表示」をクリックします。
サインインページが表示されるのでクリックします。
Oktaのサインインページが表示されるので、Oktaに設定したユーザー名とパスワードを入力して「サインイン」ボタンをクリックします。
認証が行われ、jwt.io にリダイレクトされます。
おわり
実は最後のサインインページを表示する際にエラーになり、3回ほど環境を作り直しています。
結局なにがエラーの原因だったのかはよくわからず(ブラウザやCognito、Oktaのキャッシュのせい?)。
検証はFirefoxなどの別のブラウザやシークレットモードを使用することが大事だったのではないかと思っています。