この機能はデリゲーションを使用します。デフォルトでは、2017 年 6 月 8 日時点でアドオンを使用していないテナントでは、デリゲーションは無効になっています。現在デリゲーションを必要とするアドオンを使用している既存のテナントは、この機能を引き続き利用できます。今後、デリゲーション機能が変更またはサービスから削除される場合は、現在利用中のお客様に事前に通知し、移行に向けた十分な期間が設けられます。さらに、デリゲーションはカスタムドメインの使用をサポートしていないため、それに依存する機能はカスタムドメインと併用すると完全には動作しない可能性がある点に注意してください。
ステップ 5 - IDトークン を使用して ID 情報を連携する
この最後のステップでは、次のことを行います。
- (JWT) を渡して、サービスに ID 情報を連携します。
- トークンを検証します。
- ペットの購入者を割り当てるために、ユーザープロファイル情報を抽出します。
Lambda 関数を使用して、ユーザーに関する情報を処理し、取得できます。たとえば、購入トランザクション中に、 とともに返されたユーザープロファイルから username を取得したとします。一方で、ユーザー情報を、JSON Web Token (JWT) である IDトークン自体に埋め込むこともできます。
JWT を使用する利点は、次のとおりです。
- JWT の真正性を検証できる。
- 呼び出し元のユーザーが認証済みであることを確認できる (改ざんされている可能性のある平文のパラメーターに依存する代わりに) 。
さらに、認可に JWT を使用することもでき、その場合は Amazon API Gateway との IAM 統合は不要になります。ただし、認可に API Gateway を使用すると、Lambda 関数を呼び出す前に API 呼び出しを停止できる点に注意してください。
JWT にユーザー情報を追加する方法はいくつかあります。次の例では、ユーザーのメールアドレスを JWT に追加していますが、同じ考え方を他のユーザー属性にも適用できます。
ユーザーのメールアドレスをJWTに追加する方法の1つは、Rule を使用することです。これは、認証するユーザーのJWTでこの値を常に利用できるようにしたい場合に適した方法です。
login.js では、このスコープが auth.signin に渡すパラメーターに指定されていることを確認できます。
$scope.login = function() {
var params = {
authParams: {
scope: 'openid email'
}
};
auth.signin(params, function(profile, token) {
...
}
}
JWT にはユーザーの完全なユーザープロファイルを含めることもできますが、通常はすべてのリクエストで JWT が渡されるため、本当に必要な情報だけを含めるようにしてください。
AWS Lambda コンソールでは、ブラウザーのコンソールで Node.js コードを入力する場合に使用できる Node モジュールが限られているため、ID トークンを処理するには追加のモジュールを含め、Lambda 関数をパッケージとしてアップロードする必要があります。
詳細については、Creating Deployment Packages using Node.js および Uploading Deployment Packages and Testing を参照してください。
次のシードプロジェクトには、更新後の AWS Lambda 関数に必要なコードが含まれています。
<%= include('../../../_includes/_package', { org: 'auth0', repo: 'auth0-aws', path: 'examples/api-gateway/lambda' }) %>
シードプロジェクトには、2 つのカスタム JavaScript ファイルがあります。
index.js: メインのコードが含まれています。
auth0-variables: 更新が必要なコードが含まれています。
カスタムファイルに加えて、標準の Node.js package.json ファイルもあります。
このコードは、JWT から情報を抽出して検証するための機能を追加します。デフォルトでは、Auth0 は JWT の署名に対称鍵を使用しますが、非対称鍵を使用することもできます (トークンをサードパーティで検証できるようにする必要がある場合は、非対称鍵を使用し、公開鍵のみを共有してください) 。
トークンの検証について詳しくは、Auth0 がサポートする ID プロトコルを参照してください。
auth0-variables.js をシークレットキーで更新してください。このキーは、 の Application の Settings タブにあります。
var env={};
env.AUTH0_SECRET='{yourAuth0Secret}';
module.exports = env;
ファイルがあるディレクトリで npm install を実行し、内容を zip 化して (index.js は zip のルートに配置する必要があります) 、PurchasePet Lambda 関数で使えるようにアップロードします。これをテストすると、JWT がメッセージ本文に含まれていないため、認可エラーが発生するはずです。
index.js のロジックを確認してください。60 行目付近に、トークンを検証し、購入ロジックで使用する ID 情報を含むデコード済みの情報を抽出する処理があることがわかります。
if(event.authToken) {
jwt.verify(event.authToken, secret, function(err, decoded) {
if(err) {
console.log('failed jwt verify: ', err, 'auth: ', event.authToken);
context.done('authorization failure', null);
} else if(!decoded.email)
{
console.log('err, email missing in jwt', 'jwt: ', decoded);
context.done('authorization failure', null);
} else {
userEmail = decoded.email;
console.log('authorized, petId', petId, 'userEmail:', userEmail);
dynamo.getItem({TableName:"Pets", Key:{username:"default"}}, readcb);
}
});
} else {
console.log('invalid authorization token', event.authToken);
context.done('authorization failure', null);
}
...
最後の手順では、JWT をブラウザクライアントで使用するメソッドに渡します。
標準のメソッドでは、Authorization ヘッダーにベアラートークンを設定します。IAM 認可を無効にし、認可を OpenIDトークン のみに依存させることで、この方法を使用できます (その場合、Authorization ヘッダーを AWS Lambda 関数に渡されるイベントデータにマッピングする必要もあります) 。
ただし、IAM を使用している場合、AWS API Gateway は Authorization ヘッダーにメッセージの署名を格納するため、このヘッダーに JWT を挿入すると認証が機能しなくなります。この場合は、次のいずれかの方法を使用できます。
- JWT 用のカスタムヘッダーを追加する。
- カスタムヘッダーをメッセージ本文に含める。
カスタムヘッダーを使用する場合は、pets/purchase の POST メソッドの Integration Request に対しても、追加のマッピングが必要になります。
検証プロセスを簡単に保つには、JWT を POST リクエストの本文で AWS Lambda 関数に渡します。これを行うには、home.js の buyPet メソッドを更新し、本文から userName を削除して、次のように authToken を追加します。
function buyPet(user, id) {
var apigClient = getSecureApiClient();
var body = {
petId:id,
authToken: store.get('token')
};
apigClient.petsPurchasePost({}, body)
.then(function(response) {
console.log(response);
$scope.pets = response.data;
$scope.$apply();
}).catch(function (response) {
alert('buy pets failed');
showError(response);
});
}
コードを S3 バケットにアップロードし、ペットの購入を試してください。すると、表示されるメッセージに購入者のメールアドレスが含まれていることがわかります。
エラーが発生した場合は、シークレットキーが正しく設定されていることを再確認してください。トークンのデコードに関する問題を確認するには、jwt.io が便利です。
このチュートリアルでは、次のことを行いました。
- AWS Lambda 関数を使用するメソッドを含む API を AWS API Gateway で作成しました。
- IAM ロールを使用して API へのアクセスを保護しました。
- を IAM と統合し、API へのアクセスをユーザー基盤に紐付けました。
- ユーザーが Database とソーシャル接続のどちらで認証されたかに基づいて、異なるレベルのアクセスを提供しました。
- ロールの割り当てを強制するために Auth0 の Rule を使用しました。
- JWT を使用して追加の認可コンテキストを提供し、適切な Lambda 関数に ID 情報を渡しました。