🐙

CognitoのOIDC連携を利用して外部のIdPと連携する

2023/10/03に公開

はじめに

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で追加できるようにはなっていなさそうです。

https://github.com/aws-amplify/amplify-cli/issues/177

ということで、先ほどの画面の「アイデンティティプロバイダを追加」から手動で追加していきます。

以下を入力する箇所があるので、順番に入力していきます。

  • プロバイダー名:任意の文字列を入力
  • クライアント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とは?を復習するのにすごく参考になりました。

https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f

https://qiita.com/is_ryo/items/a437225115b27e05c8ee

NCDCエンジニアブログ

Discussion