Как создать ресурс API-авторизатора Gatway, в режиме без сервера - PullRequest
0 голосов
/ 22 января 2020

Я использую cognito authorizer в своем API и использую без сервера для настройки API. Чтобы добавить авторизатор к функциям, я нашел этот код ( Как настроить мой бессерверный YML для использования моего API Gateway Authorizer? ):

teste:
  handler: handler.teste
  memorySize: 128
  events:
    - http:
        path: teste
        method: get
        authorizer:
          name: api-authorizer
          arn: arn:aws:cognito-idp:XXXXXXXXX:XXXXXXXXXX:userpool/XXXXXXX_XXXXXXX
          type: token

этот код работает очень хорошо, но Мне нужно повторить один и тот же авторизатор в нескольких функциях, и, используя этот код, для каждой функции создается новый авторизатор .... это пустая трата ресурсов и порождает беспорядок в AWS console

Для разрешения эта проблема, я пытаюсь это:

teste:
  handler: handler.teste
  memorySize: 128
  events:
    - http:
        path: teste
        method: get
        authorizer: myAuthorizer


resources:
  Resources:
    myAuthorizer:
      Type: AWS::ApiGateway::Authorizer
      Properties:
        Name: "testing"
        arn: arn:aws:cognito-idp:XXXXXXXXX:XXXXXXXXXX:userpool/XXXXXXX_XXXXXXX
        authorizerId:
          Ref: api-authorizer

Но не удалось, и я не нашел документации или руководства для этого.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

По моему мнению, повторение раздела авторизатора не так уж и сложно. В моем случае имеет смысл повторить его, поскольку мы используем области видимости.

listItems:
  handler: handler.listItems
  events:
    - http:
        method: get
        path: /list-items
        authorizer:
          arn: ${self:custom.vars.${self:custom.vars.stage}.userPoolArn}
          scopes:
            - transactions/read              

writeItem:
  handler: handler.writeItem
  events:
    - http:
        method: post
        path: /write-item
        authorizer:
          arn: ${self:custom.vars.${self:custom.vars.stage}.userPoolArn}
          scopes:
            - transactions/write

Но если вы хотите поделиться авторизатором, он здесь.

resources:
  Resources:
    ApiGatewayAuthorizer:
      Type: AWS::ApiGateway::Authorizer
      Properties:
        AuthorizerResultTtlInSeconds: 300
        IdentitySource: method.request.header.Authorization
        Name: Cognito
        RestApiId:
          Ref: YourApiGatewayName
        Type: COGNITO_USER_POOLS
        ProviderARNs:
          - arn:aws:cognito-idp:${self:provider.region}:xxxxxx:userpool/abcdef

functions:
  deleteUser:
      ...
    events:
      - http:
          path: /users/{userId}
          ...
          # Provide both type and authorizerId
          type: COGNITO_USER_POOLS # TOKEN or REQUEST or COGNITO_USER_POOLS, same as AWS Cloudformation documentation
          authorizerId:
            Ref: ApiGatewayAuthorizer # or hard-code Authorizer ID

Ссылка: https://serverless.com/framework/docs/providers/aws/events/apigateway/#share -authorizer

0 голосов
/ 22 января 2020

То, что вы ищете, - это определенный тип API Gateway Authorizer, Cognito Authorizer . Они специально предназначены для аутентификации пользователей из пула пользователей Cognito.

Чтобы использовать Cognito Authorizer с без сервера , ваш serverless.yml может выглядеть примерно так:

teste:
  handler: handler.teste
  memorySize: 128
  events:
    - http:
        path: teste
        method: get
        authorizer:
          arn: arn:aws:cognito-idp:XXXXXXXXX:XXXXXXXXXX:userpool/XXXXXXX_XXXXXXX

Вам не нужно отправлять имя или тип авторизатора при использовании Cogntio Authorizer. Кроме того, arn должен указывать на ваш пользовательский пул Cognito, который, как показано в вашем примере, выглядит следующим образом.

Оформление документации на сервере topi c на пользовательских авторизаторах , если вы хотите больше информации или примеров.

...