AWS API GatewayをCognito ユーザPool認証ユーザのみアクセス可能にする

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

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)
    })
  }
}