web-dev-qa-db-ja.com

サーバーレスフレームワークを使用したCognitoユーザープール認証

Aws cognito userpoolを使用してAPIエンドポイントを承認する必要があります。手動で行うことはできますが、サーバーレスフレームワークを使用して認証部分を自動化する必要があります。

サーバーレスフレームワークはaws cognitoをサポートしていますか?

もしそうなら、サーバーレスでaws-userpoolをどのようにセットアップしますか?

17
nusgajy

はい 。 Cognitoユーザープール承認者に対するサーバーレス(v1.5)サポート。

サーバーレスの以前のバージョンを使用している場合は、v1.5以降を更新する必要があります。

APIエンドポイントのユーザープール認証では、プールarnを指定する必要があります。

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get
          integration: lambda
          authorizer:
            name: authorizer
            arn: arn:aws:cognito-idp:us-east-1:123456789:userpool/us-east-1_XXXXXX

詳細は this の記事をご覧ください。

28

リソースで宣言した承認者をCognitoユーザープールに設定する場合は、CloudFormationを使用して承認者も作成する必要があります。

functions:
  functionName:
    # ...
    events:
      - http:
          # ...
          authorizer: 
             type: COGNITO_USER_POOLS
             authorizerId: 
               Ref: ApiGatewayAuthorizer

resources:
  Resources:
    ApiGatewayAuthorizer: 
      Type: AWS::ApiGateway::Authorizer
      Properties: 
        Name: CognitoUserPool
        Type: COGNITO_USER_POOLS
        IdentitySource: method.request.header.Authorization
        RestApiId: 
          Ref: ApiGatewayRestApi
        ProviderARNs: 
          - Fn::GetAtt:
              - UserPool
              - Arn

    UserPool:
      Type: AWS::Cognito::UserPool
18
Dehli

サーバーレス1.35.1

誰かがこれを偶然見つけた場合に備えて。これが私の実用的な解決策です。

ユーザープールをどこに作成しても、先に進んでApiGatewayAuthorizerを追加できます。

# create a user pool as normal
CognitoUserPoolClient:
  Type: AWS::Cognito::UserPoolClient
  Properties:
    # Generate an app client name based on the stage
    ClientName: ${self:custom.stage}-user-pool-client
    UserPoolId:
      Ref: CognitoUserPool
   ExplicitAuthFlows:
   - ADMIN_NO_SRP_AUTH
   GenerateSecret: true

# then add an authorizer you can reference later
ApiGatewayAuthorizer:
  DependsOn:
  # this is pre-defined by serverless
  - ApiGatewayRestApi
  Type: AWS::ApiGateway::Authorizer
  Properties:
    Name: cognito_auth
    # apparently ApiGatewayRestApi is a global string
    RestApiId: { "Ref" : "ApiGatewayRestApi" }
    IdentitySource: method.request.header.Authorization
    Type: COGNITO_USER_POOLS
    ProviderARNs:
    - Fn::GetAtt: [CognitoUserPool, Arn]

次に、関数を定義するとき

graphql:
  handler: src/app.graphqlHandler
  events:
  - http:
    path: /
    method: post
    cors: true
    integration: lambda
    # add this and just reference the authorizer
    authorizer:
      type: COGNITO_USER_POOLS
      authorizerId:
        Ref: ApiGatewayAuthorizer
3
sevensevens