【AWS】Cognito でLambdaアクセス認可(Cors対応)

1. 使用するサービス

(AWS)

  • Lambda
  • Cognito

2. 概要

ApiGatewayの認可機能の1つとしてCognitoを選択できます。その設定の仕方とcorsを適用している場合のレスポンスの留意点を説明します。
前提としてCognitoで既にユーザプールは作成済とします。

3. 実装

3-1. Authorizer作成

ApiGatewayから認可機能をつけるApiを選択し、Authroizer項目を選択します。

Authorizer_setting
Authorizer設定

Cognito User Poolには事前に作成したUser Poolが選択できるはずなので、それを選んでください。


3-2. メソッドに対して認証をつける

認可機能を付与したいメソッドのリクエストを選択し、Authorizationに作成したAuthorizerを選択します。

authorizer_attached
メソッドにAuthorizer付与


3-3. 認可確認

以上の設定で、クライアントの通信するヘッダにAuthorizationを付与し、値に事前にCognitoへの認証で得たidTokenを入れます。
認可が成功すると、ApiGatewayで設定した通りにレスポンスが返ってきます。主にCorsの部分が気になると思います。
認可が正しくできた場合はCorsが上手く機能しますが、認可が失敗した場合は恐らく403のCorsエラーが出るかと思います。

No 'Access-Control-Allow-Origin' header is present on the requested resource.

よく見るエラーかと思います。
原因としては認可失敗の場合、Access-Control-Allow-Origin Headerが無いからである。

その設定はApiGatewayのGateway Responseから行います。
レスポンスヘッダに該当のヘッダを付与することで、Unauthoriedを返す場合にレスポンスヘッダに追加したヘッダを付与できます。

edit_unauthorized_response
Unauthorizedのレスポンス編集

これにより、認可失敗の場合でも正しい形でレスポンスを遅れます。これが無いとクライアント側は何故エラーがあったのか(Unauthorized)がわかりません。