Неаутентифицированные и аутентифицированные API с использованием Cognito - PullRequest
1 голос
/ 07 мая 2019

Я следовал руководству на https://serverless -stack.com , чтобы создать API "событий". Администратор создает событие, а затем может установить свойство как «опубликованное», чтобы гости могли просматривать эти события.

Это хорошо работает, и у меня есть настройка бэкэнда. Теперь мне нужно создать календарь внешнего интерфейса, который извлекает все события published: true. Я создал службу под названием getPublished, которая будет извлекать опубликованные события.

Я хочу разрешить гостевой / неаутентифицированный доступ к этому сервису, при этом требуя аутентификацию для всех других маршрутов (кроме listPublished - но я могу это выяснить, когда выясняю getPublished).

service: events-app-api

# Use the serverless-webpack plugin to transpile ES6
plugins:
  - serverless-webpack
  - serverless-offline

# serverless-webpack configuration
# Enable auto-packing of external modules
custom:
  webpack:
    webpackConfig: ./webpack.config.js
    includeModules: true

provider:
  name: aws
  runtime: nodejs8.10
  stage: prod
  region: us-east-1

  # 'iamRoleStatements' defines the permission policy for the Lambda function.
  # In this case Lambda functions are granted with permissions to access DynamoDB.
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:us-east-1:*:*"

functions:
  # Defines an HTTP API endpoint that calls the main function in create.js
  # - path: url path is /events
  # - method: POST request
  # - cors: enabled CORS (Cross-Origin Resource Sharing) for browser cross
  #     domain api call
  # - authorizer: authenticate using the AWS IAM role
  create:
    handler: create.main
    events:
      - http:
          path: events
          method: post
          cors: true
          authorizer: aws_iam

  get:
    # Defines an HTTP API endpoint that calls the main function in get.js
    # - path: url path is /events/{id}
    # - method: GET request
    handler: get.main
    events:
      - http:
          path: events/{id}
          method: get
          cors: true
          authorizer: aws_iam

  getPublic:
    # Defines an HTTP API endpoint that calls the main function in get.js
    # - path: url path is /events/{id}
    # - method: GET request
    handler: getPublic.main
    events:
      - http:
          path: public/events/{id}
          method: get
          cors: true

  list:
    # Defines an HTTP API endpoint that calls the main function in list.js
    # - path: url path is /events
    # - method: GET request
    handler: list.main
    events:
      - http:
          path: events
          method: get
          cors: true
          authorizer: aws_iam

  listPublic:
    # Defines an HTTP API endpoint that calls the main function in list.js
    # - path: url path is /events
    # - method: GET request
    handler: listPublic.main
    events:
      - http:
          path: public/events
          method: get
          cors: true

  update:
    # Defines an HTTP API endpoint that calls the main function in update.js
    # - path: url path is /events/{id}
    # - method: PUT request
    handler: update.main
    events:
      - http:
          path: events/{id}
          method: put
          cors: true
          authorizer: aws_iam

  delete:
    # Defines an HTTP API endpoint that calls the main function in delete.js
    # - path: url path is /events/{id}
    # - method: DELETE request
    handler: delete.main
    events:
      - http:
          path: events/{id}
          method: delete
          cors: true
          authorizer: aws_iam

# Create our resources with separate CloudFormation templates
resources:
  # API Gateway Errors
  - ${file(resources/api-gateway-errors.yml)}

1 Ответ

1 голос
/ 07 мая 2019

Когда вы определяете службу в бессерверной инфраструктуре, вы указываете ее поведение в файле serverless.yml, например ( из их главы Get Note ):

  get:
    handler: get.main
    events:
      - http:
          path: notes/{id}
          method: get
          cors: true
          authorizer: aws_iam

Строка authorizer: aws_iam - это то, что настраивает вашу лямбда-функцию для использования авторизатора (в данном случае роли IAM).

Если вы удалите эту строку, вы развернете функцию без авторизатора.Функции без авторизаторов могут вызываться любым пользователем.

Эта конфигурация специфична для каждой функции, поэтому вы можете удалить authorizer из одной спецификации и оставить ее для другой.

Inтогда ваш случай (и без кода, который я только догадываюсь), все, что вам нужно сделать, это удалить строку authorizer из спецификации для getPublished.

...