###パート1(1/2)はこちら
このブログは、Auth0のSecure AWS API Gateway Endpoints Using Custom Authorizerを日本語化したものです(英語版のPart 3 およびPart 4の内容です)。
本ブログは2部構成になっています。パート1をまだ読んでいない方は、はじめにパート1を読んでいただくことをお薦めいたします。
##3. カスタムオーソライザーを作成する
チュートリアルの1章では、Auth0をAPI Gatewayと連携するための設定方法を説明しました。2章ではAmazon Web Services (AWS) API Gatewayを使用してAPIをインポート、テスト、およびデプロイする方法を紹介しました。3章では、適切な権限を持つユーザーのみがAPIのバックエンドにアクセスできるように、このAPIを保護する方法を説明します。
これを実行するために、API Gatewayのカスタム [リクエスト] オーソライザーを使用します。これによりOAuth 2.0やSAMLなどbearerトークン認可戦略を用いてAPI認可を行うことが可能になります。リクエストを受信するたびに、以下の処理が行われます:
- API Gatewayは適切に構成されたカスタムオーソライザーを確認します。
- API GatewayはAuthorizationトークンを使用して(Lambda関数の機能により)カスタムオーソライザーを呼び出します。
- Authorizationトークンが正当な場合、カスタムオーソライザーは適切なAWS Identity and Access Management (IAM) ポリシーを返します。
- API Gateway はリクエストを認可するために手順3で返されたポリシーを使用します。
カスタムオーソライザーを準備する
Auth0が発行したトークンをサポートするサンプル カスタムオーソライザーをダウンロードします。その後、あなたの環境でカスタムオーソライザーが動作するためにファイルをカスタマイズする必要があります。
-
指定したフォルダにダウンロードされたサンプルファイルを解凍し、コマンドラインを使用して該当フォルダに移動します。
-
サンプルフォルダの中で、デプロイに必要なNode.jsパッケージをインストールするために、
npm install
を実行します。後の手順でAWSにアップロードをしますが、AWSはバンドルされているファイルを含めた、これらのファイルを必要とします。 -
.env
ファイルにローカル環境変数を定義します。cp .env.sample .env
を実行することで、.env.sample
ファイルを.env
ファイルへコピー(すると同時にリネーム)することができます。以下の変更を行います:
パラメーター | 値 |
---|---|
TOKEN_ISSUER |
トークンの発行者。Auth0がトークンの発行者の場合、https://${account.namespace}/ を定義します。 |
JWKS_URI |
JWKSエンドポイントのURL。Auth0がトークンの発行者の場合、https://${account.namespace}/.well-known/jwks.json を定義します。 |
AUDIENCE |
第1章で作成されたAPIのAudienceの値 |
※ ${account.namespace}は、あなたのAuth0ドメインです。
例えば、定義が完了すると.envファイルは以下のようなテキストになります:
JWKS_URI=https://hfurutaau.au.auth0.com/.well-known/jwks.json
AUDIENCE=hVG7...3QA1q
TOKEN_ISSUER=https://hfurutaau.au.auth0.com/
- ローカルでカスタムオーソライザーをテストします。
a. はじめに、正当なJWT Access Tokenを取得します。JWT Access Tokenを取得する方法は複数あり、選択する方法はクライアントのタイプ、信頼レベル、または全体的なエンドユーザーエクスペリエンスによって異なります。
API用のテスト トークンはAuth0 ダッシュボードの APIs > 作成したAPI > Test から入手できます。詳細については Access Tokenの入手方法を参照してください。
b. ローカルにトークン情報を含んだevent.json
ファイルを作成します。サンプルファイルからコピーすることができます(コマンドラインから cp event.json.sample event.json
を実行)。 ACCESS_TOKEN
に手順a.で入手したJWTトークン, methodArn
に APIのGET
メソッドにある適切なARNの値で置き換えてください。
methodArn
の値を入手するには:
- AWS API Gatewayコンソールで、PetStore APIを開きます。
- 左側のナビゲーションパネルにある、リソース をクリックします。
- 中央の リソース パネルで、 リソースツリーを展開し、
/pets
の下にあるGETをクリックします。 - メソッドリクエストボックスの中に、ARNがあるのを確認できます。
c. npm test
を実行してテストを行います。ここではlambda-localパッケージを使用して、カスタムオーソライザーのテストします。テストが成功した場合は、次のような文字列が出力されます:
Message
------
{
"principalId": "C8npTEMVnBrILsBTI91MOh6dfuZbPVAU@clients",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-east-1:1234567890:apiId/stage/method/resourcePath"
}
]
},
"context": {
"scope": "FULL_LIST_OF_SCOPES"
}
}
Effect
の値がAllow
の場合、カスタムオーソライザーはAPI Gatewayを呼び出すことが許可されます。
IAMロールの作成
IAMロールには、Lambda関数を呼び出すために必要な権限があります。カスタムオーソライザーを実行する前に、API Gatewayがアクセスリクエストを受け取るたびにカスタムオーソライザーを呼び出すことができるIAMロールを作成する必要があります。
1.AWSにログインし、IAM Consoleにアクセスし、画面左側のナビゲーションバーからロールをクリックします。
2.ロールの作成をクリックします。
3.AWS サービス ロールを選択し、その下にある、AWS Lambda をクリックしたのち、画面下にある 次のステップ:アクセス権限ボタンをクリックします。
4.アクセス権限ポリシーをアタッチする 画面で、AWSLambdaRoleを選択します (たくさんのポリシーが表示されているのでフィルターを使用して検索することをお勧めします)。AWSLambdaRoleの左側にあるチェックボックスをOnにしてから 次のステップ:確認をクリックします。
5.ロールの作成:確認画面で、ロール名を入力します( 例えば Auth0Integration
)。その他の項目はそのままにして、ロールの作成をクリックします。
6.AWSがロールの作成を完了すると、IAMのロールページにリダイレクトされます。作成されたロールをクリックしてください。
7.作成したロールの概要ページで、信頼関係タブをクリックします。
8.信頼関係の編集をクリックし、ポリシードキュメントフィールドに以下のJSON snippetを追加してください。:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"apigateway.amazonaws.com",
"lambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
```
信頼ポリシーの更新をクリックします。
9 ロールの概要ページにリダイレクトされます。後ほど使用するので、画面上に記載されているロールARNの値をコピーしておいてください。
Lambda関数の作成 および カスタムオーソライザーのデプロイ
これまでカスタムオーソライザーをあなたの環境用に構成し、テストを通して動作することを確認してきました。つづいてAWSにカスタムオーソライザーをデプロイします。
1.はじめに、コマンドラインからnpm run bundle
を実行してAWSにアップロードするためのバンドルを作成する必要があります。このコマンドを実行すると、AWS Lambdaに必要なソース、構成ファイル、node modulesを含んだ`custom-authorizer.zip'が生成されます。
2.Lambdaコンソールに移動し、関数の作成をクリックします。
3.関数の作成 ページで、一から作成 をクリックします。
4.一から作成 オプション画面で、Lambda関数の作成に必要な以下の情報を登録します(Lambda関数設定画面の基本設定に記載される内容です)。登録が完了したら関数の作成をクリックします:
Parameter | Value |
---|---|
名前 | Lambda関数の名前。例えば jwtRsaCustomAuthorizer
|
ランタイム |
Node.js 4.3 を選択 |
ロール |
既存のロールを選択 を選択 |
既存のロール | さきに作ったロールを選択 Auth0Integration
|
a. つづいて、関数コードを登録します。コードエントリ タイプから**.ZIPファイルをアップロード**を選択し、アップロードをクリックします。ファイル選択画面が表示されるので、先ほど作成したcustom-authorizer.zip
バンドルを選択します。
b. それから、以下の3つの内容を環境変数に登録します。これらの内容は.env
ファイルに記載した内容と同一のものを登録します:
Parameter | Value |
---|---|
TOKEN_ISSUER |
トークンの発行者。Auth0がトークンの発行者の場合、https://${account.namespace}/ を定義します。 |
JWKS_URI |
JWKSエンドポイントのURL。Auth0がトークンの発行者の場合、https://${account.namespace}/.well-known/jwks.json を定義します。 |
AUDIENCE |
第1章で作成されたAPIのAudienceの値 |
c. 関数コードのハンドラ および 実行ロールには以下の値を設定します:
パラメーター | 値 |
---|---|
ハンドラ | index.handler |
実行ロール | 既存のロールを選択 |
Existing role | さきに作ったロールを選択 Auth0Integration
|
d. 基本設定 で、タイムアウト を30秒に設定します。
上記の内容の登録が完了しましたら、保存をクリックします。
AWSが関数の作成を完了すると、以下のような画面が表示されます。
6.作成したLambda関数をテストします。画面右上にあるテストをクリックします。
7.event.json
ファイルの内容を、JSON形式でテストイベントの設定画面にコピーします。
**保存 (もしくは作成)をクリックしてテスト**をクリックします。 テストが成功した場合には、以下のような画面が表示されます。
詳細情報を開くと、ローカルテストで成功した時と同様のメッセージが表示されているのが確認できます。
API Gatewayカスタムオーソライザーの構成
API Gatewayコンソールに戻ります。
まえに作成したPetStoreを開きます。
画面左のナビゲーションバーからオーソライザーを開きます。初めてオーソライザーを作成した場合、デフォルトでオーソライザーの作成設定画面が表示されます。そうでない場合には、画面中央の新しいオーソライザーの作成をクリックして、この画面を表示することができます。
以下のパラメーターを定義してください:
パラメーター | 値 |
---|---|
Lambda リージョン | 以前作成したLambda関数のリージョンを指定します |
Lambda 関数 | jwtRsaCustomAuthorizer |
名前 | jwt-rsa-custom-authorizer |
Lambda 実行ロール | 先にコピーしたIAMロールのARN |
トークンのソース | Authorization |
トークンの検証 | ^Bearer [-0-9a-zA-z\.]*$ |
TTL (seconds) | 3600 |
作成をクリックします。
AWSがオーソライザーを作成し、ページが更新されると、オーソライザー画面の一番下にテストが表示されます。テストをクリックすると、認証トークンを入力するポップアップが表示されます。以前に使用したAuth0トークン (Bearer ey...
)を入力し、テストをクリックすることで、オーソライザーのテストをすることができます。
テストが成功した場合、以下のようなレスポンスが表示されます。
まとめ
API Gatewayチュートリアル 第3章では、アクセス要求を処理するカスタムオーソライザーの構成を行いました。これを行うには、次のようにします:
- Auth0サンプルを使用して、Lambda関数によって使用されるコードを含むバンドルを準備します
- Lambda関数を呼びだるIAMロールを作成します
- 手順1で作成したカスタムバンドルを使用するLambda関数を作成します
- 手順3で作成したLambda関数を使用するAPI Gatewayカスタムオーソライザーを作成します
第4章では、作成したカスタムオーソライザーを実際に使ってみます。
4: カスタムオーソライザーを使用してAPIを保護する
第1章ではAPI Gatewayで使用するAuth0の構成をしました。第2章ではAPI Gatewayを使用してAPIを構成しました。第3章ではAPIがアクセスリクエストを受け取った際に、適切なポリシーを検索できるようにカスタムオーソライザーを構成しました。本章ではどのようにAPIエンドポイントを保護するためのカスタムオーソライザーの使用方法を説明します。
カスタムオーソライザーを使用するためにAPI Gatewayリソースを構成する
AWSにログインし、API Gatewayコンソールに移動します。
注意: カスタムオーソライザーは、メソッドごとにメソッドに設定されます。1つのオーソライザーで複数のメソッドを保護したい場合は、各メソッドに対して次の手順を繰り返す必要があります。
2章で作成したPetStore APIを開きます。画面中央のリソース ツリーから、/pets
リソースのGETメソッドを選択します。
メソッドリクエストを選択します。
設定画面で、認証の右側にあるペンアイコンをクリックし、3章で作成したカスタムオーソライザーjwt-rsa-custom-authorizer
を選択します。
選択したカスタムオーソライザーの横にある、チェックマークをクリックして保存します。APIキーの必要性は、確実にfalse
になっていることを確認してください。
APIのデプロイ
変更内容を公開するには、2章で行ったAPIのデプロイをする必要があります。
デプロイが成功すると、Testステージエディターにリダイレクトされます。画面一番上の青いバナーにURLの呼び出しが記載されているので、URLの情報をコピーしておいてください。デプロイしたAPIのテストをする際に必要となります。
デプロイしたAPIのテスト
上記手順でコピーした、GETコールにあるURLの呼び出しを使用して、デプロイしたAPIのテストができます。
curl --request GET \
--url https://your_invoke_url/pets
まとめ
このチュートリアルで、以下のことを学習いたしました。
- API Gatewayを使用するためにAuth0を構成
- API Gatewayを使用するためにAPIをインポート
- AWS IAMおよびLambdaと一緒に動作することが必要なAPIエンドポイントをセキュアにするためのカスタムオーソライザーの作成
- カスタムオーソライザーを使用してAPIを保護