API GatewayをCognitoで認証
したユーザのみアクセス可能にします。
参考: REST API を Amazon Cognito ユーザープールと統合する - Amazon API Gateway
API GatewayのSwagger定義
API GatewayにCognitoのjwtをAPIキーとして送信し、検証する。という考え方でアクセス制御を行います。
Api: Type: 'AWS::Serverless::Api' Properties: StageName: Prod DefinitionBody: swagger: "2.0" info: version: "1.0" title: "serverless-app" schemes: - "https" paths: /datas: get: responses: {} security: - Cognito_Custom_Authorizer: [] x-amazon-apigateway-integration: uri: !Sub your-lambda-func passthroughBehavior: "when_no_match" httpMethod: "POST" type: "aws_proxy" securityDefinitions: Cognito_Custom_Authorizer: type: "apiKey" name: "Authorization" in: "header" x-amazon-apigateway-authtype: "cognito_user_pools" x-amazon-apigateway-authorizer: providerARNs: - "arn-your-cognito-userpool" type: "cognito_user_pools"
securityDefinitions
セクションでapiKeyの送信方法と確認方法を記述します。
上記例では、リクエストヘッダーにAuthorization
という属性名でAPIキーを送信し、cognito_user_pools
で検証する。と読めます。
また、認証が必要なAPI Gatewayに対して、security
セクションで定義したsecurityDefinitions
の利用を宣言します。
API Gatewayへのaxiosでの接続
認証用ヘッダーをaxiosで追記して送信します。送信するjwtはログイン中ユーザのsessionからgetIdToken().getJwtToken()
で取得します。
import axios from 'axios' import { CognitoUserPool, CognitoUserAttribute, AuthenticationDetails, CognitoUser } from 'amazon-cognito-identity-js' export default { var poolData = { UserPoolId: appConfig.UserPoolId, ClientId: appConfig.UserPoolClientId } var userPool = new CognitoUserPool(poolData) var cognitoUser = userPool.getCurrentUser() var id_token = '' cognitoUser.getSession(function (err, result) { id_token = result.getIdToken().getJwtToken() }) getData: function () { axios.get( your-apigateway-endpoint + '/datas/', { headers: {'Authorization': id_token}} ).then(function (res) { console.log(res) }) } }
リンク