#はじめに
このブログは、Auth0のSecure AWS API Gateway Endpoints Using Custom Authorizerを日本語化したものです(英語版のPart 1 およびPart 2の内容です)。
AWSを使用すると、Lambda、API Gateway、およびJavaScriptクライアントをフロントエンドに使用した、強力でServerless でスケーラビリティの高いAPIとアプリケーションを作成することができます。
Serverless アプリケーションは、カスタムコードをコンピューティングサービスとして実行し、サービスをホストするオペレーティング環境を維持する必要はありません。 代わりに、AWS Lambdaやwebtask.ioのようなサービスがあなたの代わりにコードを実行します。
API Gatewayは、Lambda ファンクションの前段にサービスレイヤーを追加し、セキュリティを拡張し、入力/出力時のメッセージ変換を管理し、スロットリングや監査等の機能を提供することで、Lambdaの機能を拡張します。 Serverless アプローチは、スケールアウトやフォールトトレランスのような懸念事項がコードを実行するコンピューティングサービスの責任になるため、運用上の要求事項を簡素化されます。
このチュートリアルでは、APIゲートウェイを使用してAPIを設定方法、Lamdba ファンクション (カスタムオーソライザを含む)の作成、および設定してAPIエンドポイントを保護し、ユーザーがAPIにアクセスするために必要なAccess TokenをAuth0から取得できるための認可フローを実装する方法を説明します。
より具体的には、カスタムオーソライザーは:
- APIに対するアクセスに対するリクエストの
authorization
ヘッダーを介してAccess Tokenがパスされたことを確認します - JWKSエンドポイント経由で取得した公開鍵を使用し、Access TokenのRS256署名を検証します
- Access Tokenに必要なIssuer
iss
および Audienceaud
Claim情報があることを確認します
OAuth 2.0は初めてですか? OAuth 2.0の紹介をご覧ください。
さて、このチュートリアルでは、以下のセクションに分けて解説をしています。
1章 - Auth0 を設定する
2章 - AWS API Gateway のセットアップおよび導入
3章 - カスタムオーソライザー の作成
4章 - カスタムオーソライザーを使用してAPIを保護する
##API Gatewayカスタムオーソライザーの動作
Amazonによると、API Gatewayカスタムオーソライザーは、「OAuthやSAMLなどのベアラートークン認証方法を使用して、APIへのアクセス制御を提供するLambda関数制御を提供するLambda関数」です。
どのような場合でも誰か(もしくはプログラム)がAPIを呼び出す際には、API GatewayはAPIにカスタムオーソライザーが設定してあるかどうかをチェックします。
APIにカスタムオーソライザーが設定されている場合には、API Gatewayはカスタムオーソライザーを呼び出し、受信したリクエストヘッダーから抽出したAuthorizationトークンを提供します。
カスタムオーソライザーはJWTの検証、リクエストを認可するIAMポリシーなど、異なるタイプの認可ストラテジで実装することができます。もしポリシーが無効、もしくは承認されなかった場合には、APIコールは失敗します。
有効なポリシーの場合、APIは返されたポリシーをキャッシュし、それを受信したトークンに関連付けし、現在および将来の要求に使用します。ポリシーをキャッシュをする時間は設定可能です。デフォルトは300
秒、最大キャッシュ時間は3600
秒です(値に0を設定することでキャッシュを無効化することもできます)。
##はじめる前に
このチュートリアルを始める前に、AWSアカウントでAWSにサインアップする必要があります。これにより、このチュートリアルで使用するAWSのすべての機能 (API GatewayやLambdaなど)にアクセスできます。新規登録メンバーはAWSに12ヶ月間無償でアクセスすることができます。
##参考文献
API認可 (API Authorization)
Auth0 Access Tokenを取得する
JSON Web Key Sets (JWKS)
#1. Auth0 にAPIを登録する
正常に認可されたクライアントが使用するAPIを構成する必要があります。Auth0 管理DashboardのAPIsセクションから構成することができます。
CREATE API をクリックして、連携のための新しいAPIを作成します。
以下の項目に対して、値の入力を求められます:
パラメーター | 値 |
---|---|
Name | APIに対するわかりやすい名称。この値はAuth0 APIs画面でリスト表示されます |
Identifier | APIの論理識別子 (この識別子のフォーマットにはURL https://your-api-gateway のように定義することを推奨します) |
Signing Algorithm | 発行されたAccess Tokenを署名する際にAuth0が使用するアルゴリズム |
CREATE をクリックして、次に進みます.
新しく作成したAPIの詳細については、Setting ページを参照してください。
APIを作成すると、APIで使用するためのNon Interactive Clientも作成されます。このクライアントは、API設定のNon Interactive Clientsタブで Authorized とリスト表示されます。さらにこのチュートリアルの3章で必要となるため、Client IDを書き留めておいてください。
#2. API Gateway APIのインポートおよび導入
チュートリアルのこの章については、AWSの公式例を基に作成されています。
詳しくは[こちら]をご参照下さい。
AWS API Gatewayチュートリアルを行うこの章では、API Gatewayを使用して、以下のようなAPIのインポート方法および管理方法を紹介いたします:
・API GatewayにAPIをインポートする
・ImportしたAPIのテスト
・どのようなフロントエンド・クライアントでも使用できるAPIのデプロイ
・デプロイしたAPIのテスト
このチュートリアルの後半で、Auth0 Access Tokenを受理したカスタムオーソライザーを使用してAPIのエンドポイントをそのようにセキュアにするか、同様にAPIをフロントエンドJavascriptクライアントに統合するかを説明いたします。
##Pets APIのインポートおよび構成
AWSアカウントでAWSにログインし、トップナビゲーションバーにあるサービスドロップダウンメニューを使用して、API Gatewayコンソールに移動します。
以前APIを作成したことがある場合は、単にAPI Gatewayコンソールが表示されるので、APIの作成をクリックし、APIの例を選択します。
まだAPI Gatewayを使用してAPIを作成したことがない場合には、以下の画面が表示されます。今すぐ始めるをクリックして次に進みます。
「Amazon API Gatewayへようこそ。...」というポップアップメッセージが表示されます。OKをクリックして次に進みます。
新しいAPIの作成フォームで、デフォルトAPIの例が選択されており、エディターにサンプルAPIが定義されていると思います。これからのチュートリアルではこのAPIを使用します。インポートをクリックしてAPIを作成します。
作成が完了すると、AWSにAPIが作成され、提供されたデータが入力されたことを示すメッセージが表示されます。
APIにはすでに関連したメソッドが存在することに注意して下さい(つまりGET
とPOST
)。リソースツリーからメソッド名をクリックすることで、メソッドの詳細を表示したり、設定の変更をしたり、メソッドの呼び出しをテストすることができます。
###APIをテストする
APIを正常にインポートできたので、全てが期待通りに動作するかを確認するために、いくつかテストを実行してみましょう。この演習では、API自体のいくつかの機能についても説明します。
例として、/pets
配下のPOSTをクリックします。POST
メソッドの構造と振る舞いの概要を示、メソッドの実行ウィンドウが表示されます。
メソッドリクエストとメソッドレスポンス: フロントエンドとのAPIインターフェース
統合リクエストと統合レスポンス: バックエンドとのAPIインターフェース
この領域を使用して、作成したAPIをテストできます。
テストをクリックします(ページ中央にある、細長いクラアント領域にあります)。
/pets - POST - メソッドテスト
ページにリダイレクトされます。
画面を底部までスクロールし、リクエスト本文に以下の文字列を入力します:
{"type": "dog", "price": 249.99}
リクエスト本文はデータベースに追加したいペットの属性、およびペットの価格を示しています。
テストをクリックします。
テスト結果はページの右側に表示されます。
###APIをデプロイする
上記で完了したテストは、API Gatewayコンソールを使用して実行しました。異なるクライアントでAPIを使用するためには、APIをステージ環境にデプロイする必要があります。これはアクションメニューのAPIのデプロイオプションから実行することができます。
以下のパラメーターについて入力を求められます:
パラメーター | 値 |
---|---|
デプロイされるステージ | **[新しいステージ]**を選択 |
ステージ名 | ステージの名称を入力します |
ステージの説明 | ステージの説明を入力します |
デプロイメントの説明 | APIデプロイメントの説明を入力します |
適切な値の入力が完了したらデプロイをクリックします。
###デプロイメントのテスト
APIが正常にデプロイされると、Testステージエディターにリダイレクトされます。ここでAPIが正常にデプロイできたかどうかをテストすることができます。
Testステージエディターの一番上にある青いバナーにURL の呼び出しが表示されています。これはAPIのGET
エンドポイントを呼び出すためのURLです。
GET /
メソッドリクエスト画面に表示されたURLをクリックします。すると以下のようなレスポンスが表示されるはずです:
次に、/pets/{petId}
のGETメソッドをコールします。ステージページでTestツリーを展開して下さい。
画面の一番上の青いバナーにURL の呼び出しが表示されています。最後の部分{pedID}はパス変数を表しています。この変数を1に置き換え、ブラウザを使用して新しいURLにアクセスします。次のJSONペイロードでHTTP 200リクエストを受信するはずです:
{
"id": 1,
"type": "dog",
"price": 249.99
}
###第2章のまとめ
AWS API Gatewayチュートリアルの第2章では、以下の内容をカバーしました:
・API GatewayにAPIをインポートする
・インポートしたAPIのテスト
・どのようなフロントエンド・クライアントでも使用できるAPIのデプロイ
・デプロイしたAPIのテスト
これでAPI Gatewayによって管理された完全に機能するAPIが完成しました。
###パート2(2/2)に続きます。
パート2では、以下の項目について説明をします。
3章 - Auth0 カスタムオーソライザーの作成
4章 - カスタムオーソライザーを使用してAPIを保護する
###パート2へ行く###