見出し画像

Cognitoを裏側の認証・認可サーバーとして使用するためのAPI紹介

こんにちは。株式会社SHIFT DAAE部の栗山です。
今日はAWS Cognitoを「裏側」の認証・認可サーバーとして使用するためのAPIを紹介します。

CognitoにはHosted UIというログイン画面が組み込まれており、これを使用すると認証処理を実装したり、そのための画面を作成する必要はありません。パスコード認証画面も、SNS認証画面もすべてCognitoが用意してくれます。

しかしながら、このHosted UIはデザインの自由度が低く、とくに一般顧客向けのシステムでは利用するのはなかなか難しいと思います。そこで今回はHosted UIを使用せず、Cognitoに対してAPIサーバからアクセスするようにして、Cognitoの各種認証機能を使用するためのAPIを紹介したいと思います。

※タイトルの「裏側」というのは、ユーザーが直接Cognitoにアクセスする構成ではなく、CognitoをAPIサーバーの後ろに配置するような構成を意味しています。

このような構成でCognitoを利用するメリットを以下にあげます。

  1. アクセストークン、リフレッシュトークンの発行と検証をCognitoに任せられる

  2. SNS認証をCognitoに任せられる

  3. ログイン画面を自由に作成することができる

CognitoのAPIはたくさんあるのですが、今回は中心となるAPIとして「パスコード認証」と「SNS認証」で使用するAPIを紹介します。


前提とするシステム構成

以下が前提とするシステム構成です。

Hosted UIを使用しないため、CognitoにはバックエンドのAPIからのみアクセスします。
SNS認証処理は「ユーザー ⇔ 各種SNS」「各種SNS ⇔ Cognito」でやってくれます。

パスワード認証

ではさっそく、パスワード認証で使用するCognitoのAPIを紹介します。
バックエンドからこれらのAPIを呼び出すことで「サインアップ~サインイン~ログアウト」機能を作ることができます。
※以下ではAWS CLIとJavaScriptのリンクを張ります。AWS CLIは動作確認に使用するときに便利です。

使用するAPI

  • admin-create-user[AWS CLI] [JavaScript]
    サインアップ(新規ユーザー作成)に使用します。

  • admin-initiate-auth[AWS CLI] [JavaScript]
    サインイン(ログイン)に使用します。パスワード認証のときは auth-flow オプションに ADMIN_USER_PASSWORD_AUTH を指定します。
    認証に成功するとアクセストークンとリフレッシュトークンを取得できます。有効なアクセストークン、あるいはリフレッシュトークンをもっている状態が「ログイン状態」というわけですね。
    アクセストークンの更新はリフレッシュトークンで行います。その際はauth-flow オプションに REFRESH_TOKEN_AUTH を指定します。

  • revoke-token[AWS CLI] [JavaScript]
    ログアウトに使用します。具体的にはadmin-initiate-authで取得したトークンを無効化します。

  • admin-user-global-sign-out[AWS CLI] [JavaScript]
    これもログアウトに使用するAPIですが、こちらはユーザーをすべての端末からログアウト状態にするときに使用します。

SNS認証

次に、SNS認証で使用するAPIを紹介します。
パスワード認証の場合は各種プログラミング言語用のクラスメソッドが用意されていますが、こちらはエンドポイントにアクセスして使用する形になります。

使用するAPI(エンドポイント)

  • GET /oauth2/authorize
    「認可エンドポイント」といい、ユーザーをサインインさせるのに使用します。
    使い方としては、ユーザーをこのエンドポイントにアクセスさせます。するとユーザーはSNSの認証画面に導かれ、ユーザーはそこで自分の認証情報(メールアドレスとパスワードなど)を入力します。認証に成功すると、認可コードが指定したリダイレクトURLに送付されます。
    ※SNSやリダイレクトURLはGETパラメーターで指定します。またそれらはあらかじめCognitoユーザープールに登録されている必要があります。

  • POST /oauth2/token
    「トークンエンドポイント」といい、認可エンドポイントで取得した認可コードを使用して、アクセストークンとリフレッシュトークンを取得するのに使用します。

  • GET /oauth2/userInfo
    「USERINFOエンドポイント」といい、トークンエンドポイントで使用したアクセストークンを使用してユーザー情報を取得するのに使用します。

処理の流れ(シーケンス図)

上記のAPIの使い方を文章だけで理解するのは難しいと思うので、以下に処理の流れの一例を記載します。

補足:SNS認証で取得したアクセストークンのスコープ設定

ここで一つ、ポイントとなる設定を紹介します。

SNS認証で取得するアクセストークンをCognitoのAPIで使用できるようにするためには設定が必要です。これをしないと、SNS認証で取得したアクセストークンではCognitoのAPI(例えばrevoke-token)などが使用できずとても不便です。

これを行うには、SNS認証で取得するアクセストークンのスコープを適切に設定する必要があります。具体的にはCognitoユーザープールに登録する「アプリケーションクライアント」の「OpenID Connectスコープ」に aws.cognito.signin.user.admin を指定します(※)。

※Cognitoユーザープールの「アプリケーションの統合」タブで、対象のアプリケーションクライアントを選択し、遷移先の画面の「OpenID接続スコープ」にaws.cognito.signin.user.admin を加えます。

最後に

本稿ではAWS Cognitoを使用して、パスワード認証とSNS認証を独自に実装するためのAPIを紹介しました。

DAAEエンジニアチームでは定期的に勉強会を開催するなどし、日々、技術の習得、知識の向上に努めています。本稿が多少なりとも皆様のお役に立ったり、DAAEに興味を持つきっかけになりましたら幸いです。 最後までお読みいただきどうもありがとうございます。

\もっと身近にもっとリアルに!DAAE公式Twitter/


執筆者プロフィール:Kuriyama Akira
DAAE部で開発エンジニアをしています。前職はPMとエンジニアを兼任しつつC++でデスクトップアプリの開発をしていました。モダンなWEBアプリの開発はとても学ぶことが多く、日々、勉強の毎日です。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/