CognitoのOIDC連携を利用して外部のIdPと連携する
はじめに
Cognitoでは、ユーザプールでのログインやFacebook、Googleなどのソーシャルログインに加え、SAMLやOIDCなどの外部のIdPと連携する機能があります。
今回は、その機能を使って、OIDCに準拠する外部のIdPと連携してみたので、その手順とハマったポイントについて記載します。
なんでわざわざCognitoと連携するの?
わざわざCognitoと経由しなくても、直接外部のIdPの認証機能を使って認証すれば良いのでは?と思った方もいるかと思います。が、個人的には以下の2点がメリットと考え、Cognitoと連携することとしました。
- S3などのAWSのサービスと連携しやすい
- Cognitoと連携するようにしておけば、Cognitoの認証情報を使ってS3などへのアクセス権限をコントロールする仕組みを作りやすい
- ソーシャルログインなど他の認証方法を追加しやすい
- 追加時の影響をCognitoが吸収してくれて、バックエンドのアプリケーションへの影響がない
具体的な手順
前提として、AmplifyでCognitoを作成済みの状態とします。
1.外部IdP側でクライアントID・クライアントシークレット・発行者URLを生成する
今回は、こちらは連携先のIdPの管理者に依頼して対応いただきました。
その際、外部IdP側でリダイレクトURLの入力が必要となるので、Cognitoのドメインの末尾に/oauth2/idpresponse
をつけたものを入力してもらいます。
これで、Cognitoと連携する際に必要な、クライアントID・クライアントシークレット・発行者URLがもらえるはずです。
ちなみに、発行者URLとは、OIDCの発行者を識別するための、https://
ではじまるURLです。
2.Cognitoにプロバイダを追加する
Cognitoのサインインエクスペリエンス
のタブにフェデレーテッドアイデンティティプロバイダーのサインイン
という項目があるので、こちらを追加したいです。
amplifyでCognitoを作っていたので、当然amplifyで追加したいと考えます。
ということで、amplify update auth
-> Update OAuth social providers
を選択としましたが、GoogleやFacebookなどの有名どころの選択肢はありますが、独自のOIDCのプロバイダは選べません。
以下のissueをみても、まだamplifyで追加できるようにはなっていなさそうです。
ということで、先ほどの画面の「アイデンティティプロバイダを追加」から手動で追加していきます。
以下を入力する箇所があるので、順番に入力していきます。
- プロバイダー名:任意の文字列を入力
- クライアントID:1で取得した情報を入力
- クライアントシークレット:1で取得した情報を入力
- 発行者URL:1で取得した情報を入力
少し悩んだのが以下の「許可されたスコープ」と「OpenID Connect プロバイダーとユーザープールの間で属性をマッピング」の部分です。
ここは、IdPからどういった情報を取得したいか次第なのですが、今回は以下を設定しました。
(IdP側にこれらの属性へのアクセスを許可してもらう必要があります。)
- openid:idトークンを取得するのに必要っぽい
- email:emailとりたかった
- profile:given_name、family_nameをとりたかった
3.Cognitoのアプリケーションクライアントを編集
Cognitoのアプリケーションクライアントの設定で、先ほど設定したIDプロバイダーを選択して追加します。
4.エンドポイントを叩いて検証
一通り設定が完了したので検証していきます。
検証するには、本来はフロントエンドのコードを書いて検証するのが一番ですが、一旦簡易的な方法を記載します。
以下の形で、Cognitoの認証のエンドポイント(ドメインは手順1で紹介したものと同様)に対するGETメソッドを発行して、ブラウザに貼り付けるなどすればOKです。
※ここのクライアントIDは外部IdPのものではなくCognitoのアプリケーションクライアントのクライアントIDなので注意
この時、うまく設定できていれば、外部IdPの認証画面に遷移し、その後、ブラウザのURL入力欄で認可コードを取得できるはずです。
ハマったポイント
(力尽きてきたので、少し雑にメモ)
外部IdPに、PKCEというクライアント認証の仕組みが設定されており、Cognitoとの連携がうまくいきませんでした。
AWSのサポートに問い合わせてみましたが、CognitoはPKCEを使用したIdPとは連携できないとのことだったので、外部IdP側の設定を変えてもらいました。
参考情報
そもそもOAuthとは?を復習するのにすごく参考になりました。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のポジションや、採用している技術スタックの紹介などはこちらをご覧ください! github.com/ncdcdev/recruitment
Discussion