Serverless FrameworkでCognito認証


CognitoのSignin情報を利用して、指定エンドポイントに認証を追加する方法です。

設定後の利用方法

  1. CognitoにSigninしてIdTokenを取得する
  2. 取得したIdTokenをheaderに設定してAPIのリクエストをする
    • headerのKeyは、オーソライザー作成時のトークンのソース

これだけで、認証されていない場合のアクセスを防ぐことが可能

やったこと

Api Gatewayでオーソライザー(cognito)の作成

設定画面

  • Cognitoユーザープール(ユーザー情報の場所)は、作成していると選択可能
  • トークンのソースは、APIに設定するヘッダー名を入れる
  • 作成すると、下記のようにIDができるのでそれをメモ

※おまけで、試しに認証した後にトークンのソースを変更してみたのですが、即適用されなかったです。再デプロイで適用されたので、ウォームスタート状態だと即適用はされなそうです。

serverless.yamlにauthoraizerの設定を追加

  • 要認証のエンドポイントに下記の感じで設定を入れる
      - http:
          cors: true
          path: "{proxy+}"
          method: any
          authorizer: 
            type: COGNITO_USER_POOLS
            authorizerId: "pk2q0p"
  • authorizerIdはオーソライザー作成で作られたIDを設定する

追記

公式見てて、下記の定義することで、オーソライザーを手動作成せず自動でいけました。

※env.USER_POOL_ID は、cognitoユーザープールを手動作成してできたものを設定

authorizer: 
  name: Myauthorizer
  type: COGNITO_USER_POOLS
  arn:
   !Join [ ":", [ "arn:aws:cognito-idp", Ref: AWS::Region, Ref: AWS::AccountId, "userpool/${env:USER_POOL_ID}" ] ]

まとめ

やったことなかったので試しにやってみたら、あっさりでした。
軽く作る時とかこれで十分ですね。