こんにちは、SCSK齋藤です。
今回は、Amazon API Gateway の認証方式である、Amazon Cognito を用いたM2M認証の方法について解説いたします。
本ブログは、APIを構築する前半と、プログラム側でAPIを呼び出す後半部分の2つに分けてブログを執筆します。
今回は、APIを構築する前半のブログとなります。
概要
アーキテクチャ図は下に示す通りです。今回はAPI Gatewayの裏にLambdaを設けて、API呼び出しでLambdaが動くようにします。
なお、M2M認証の処理の流れは下記の通りとなります。
①APIの呼び出し元がCognitoにアクセストークンを発行しに行く。
②受け取ったアクセストークンを、ヘッダーに付与してAPIGatewayへアクセスしに行く。
③リクエストを受けたAPIGatewayは、リクエストに付加されたアクセストークンを検証するため、Cognitoに問い合わせをする。
④アクセストークン検証の結果、問題なければ後続の処理を進める。(Lambdaの呼び出し。)
各リソースの作成
アーキテクチャ図を実現する、各リソースの作成をマネジメントコンソールベースで説明します。
なお、主にM2M認証の部分に焦点を置くため、あまり重要でない設定の作成過程は解説をスキップさせていただきます。
AWS Cognito
Cognito関連のリソースは作成されるものが多く、下記4つとなります。
- ユーザープール
- アプリケーションクライアント
- ドメイン
- リソースサーバー
マネジメントコンソールで作成すると芋蔓式で複数のリソースが同時作成されますが、本ブログでは一つ一つどのようなリソースが作成されているかみていきたいと思います。
ユーザープール
Cognitoのユーザープールの作成を行います。
ユーザープール画面にて、「ユーザープールを作成」をクリックします。
作成するユーザープールの種類を選択できるため、「Machine to Machineアプリケーション」を選択し、任意の名前を入力します。
その後、「ユーザーディレクトリを作成する」をクリックして、作成します。
作成後、ユーザープール一覧画面に遷移すると、作成したユーザープールが表示されます。
ユーザープール名をクリックします。
そうすると、概要が表示されます。
ユーザープール名が分かりづらいので、「名前の変更」をクリックして、好きな名前に編集します。
アプリケーションクライアント
Cognitoの左ベインのところから、「アプリケーションクライアント」をクリックすると、最初にユーザープールを作成した時のアプリケーション名が存在します。それをクリックすると、アプリケーションクライアントの概要が表示されます。
マネジメントコンソールの場合、自動で作成されますので、明示的な作成が不要ですが、これらのクライアントIDやクライアントシークレットは呼び出す際に必要となります。
ドメイン
次にドメインについて見ていきましょう。
同じくCognitoの左ベインから、ドメインをクリックすると、作成されたドメイン情報が閲覧できます。
ここに記載されている、ドメインURLに対して、アクセストークンを発行しに行くことになります。
また、リソースサーバーというものも存在しています。
こちらについても、編集ボタンを押下して、内容を見ていきましょう。
リソースサーバー
リソースサーバーの中には、重要なものが2つあります。
・リソースサーバー識別子
・スコープ名
どちらもすでに作成済みですが、これら2つの項目を合わせて、アクセストークン取得の際に必要となります。
Lambda
今回のAPIGatewayの裏側にあるLambdaは、特に凝ったものにする必要がないので、デフォルトのソースコードそのままとします。
単純にステータスコード200と「Hello from Lambda!」と出力されるだけのシンプルなプログラムです。
API Gateway
これまで作ったリソースを、API Gatewayに統合していきます。
まず、RESTAPIを作成し、LambdaをGetで呼び出すようにします。(作成の過程は省略します。)
本題はここからです。認証にCognitoのM2Mを使います。
作成したAPIの画面の左ベインで、オーソライザーをクリックし、その後表示される画面でオーソライザーを作成をクリックします。
任意のオーソライザー名を設定します。
オーソライザーのタイプは、Cognitoを設定し、ユーザープールの選択画面で先ほど作成したユーザープールを選択します。
トークンのソースには、下記ドキュメントの内容を参考に「Authorization」というヘッダー名を入力します。
そうすると、オーソライザーが作成されます。
最後に作成したオーソライザーを、APIに関連づけます。
まず、紐付けるAPIの左ベインのリソースをクリックし、その中からメソッド(今回はGET)の中のメソッドリクエストを選択し、設定の編集ボタンをクリックします。
認可の部分に、作成したオーソライザーを選択します。
そして認可スコープに、Cognitoのリソースサーバーで設定したリソースサーバー識別子とカスタムスコープ名を/で連結したものを入力します。
設定後、下の画面に戻るので、APIをデプロイします。
任意のデプロイステージ名を入力して、デプロイします。
まとめ
今回はAPIを認証部分含めて構築しながら解説しました。
後半となる別のブログでは、そのAPIを呼び出すプログラムの書き方について解説していきたいと思います。


















