Совместное использование Authorizer между различными службами HTTP API в AWS с помощью Serverless - PullRequest
1 голос
/ 01 апреля 2020

Я хочу поделиться авторизатором между различными сервисами HTTP API с помощью Serverless. Я видел разные ссылки, которые объясняют разделение разных конечных точек / сервисов на отдельных держателей с их собственными файлами serverless.yml, но я не могу найти информацию о том, как разделить авторизатор между ними.

Я использую базовый c пример HTTP API (не для настройки REST API), например:

org: orgexample
app: app-example
service: notes-api

plugins:
  - serverless-bundle

provider:
  name: aws
  runtime: nodejs12.x
  region: eu-west-2
  environment:
    DOMAIN_SUFFIX: notes-api
  httpApi:
    authorizers:
      serviceAuthorizer:
        identitySource: $request.header.Authorization
        issuerUrl:
          Fn::Join:
            - ""
            - - "https://cognito-idp."
              - "${opt:region, self:provider.region}"
              - ".amazonaws.com/"
              - Ref: serviceUserPool
        audience:
          - Ref: serviceUserPoolClient
functions:
  getProfileInfo:
    handler: main.get
    events:
      - httpApi:
          method: GET
          path: /user/profile
          authorizer: serviceAuthorizer
  createProfileInfo:
    handler: main.post
    events:
      - httpApi:
          method: POST
          path: /user/profile
          authorizer: serviceAuthorizer

resources:
  Resources:
    HttpApi:
      DependsOn: serviceUserPool
    serviceUserPool:
      Type: AWS::Cognito::UserPool
      Properties:
        UserPoolName: ${self:service}-user-pool-${opt:stage, self:provider.stage}
        UsernameAttributes:
          - email
        AutoVerifiedAttributes:
          - email
    serviceUserPoolClient:
      Type: AWS::Cognito::UserPoolClient
      Properties:
        ClientName: ${self:service}-user-pool-client-${opt:stage, self:provider.stage}
        AllowedOAuthFlows:
          - implicit
        AllowedOAuthFlowsUserPoolClient: true
        AllowedOAuthScopes:
          - phone
          - email
          - openid
          - profile
          - aws.cognito.signin.user.admin
        UserPoolId:
          Ref: serviceUserPool
        CallbackURLs:
          - https://localhost:3000
        ExplicitAuthFlows:
          - ALLOW_USER_SRP_AUTH
          - ALLOW_REFRESH_TOKEN_AUTH
        GenerateSecret: false
        SupportedIdentityProviders:
          - COGNITO
    serviceUserPoolDomain:
      Type: AWS::Cognito::UserPoolDomain
      Properties:
        UserPoolId:
          Ref: serviceUserPool
        Domain: ${self:service}-user-pool-domain-${opt:stage, self:provider.stage}-${self:provider.environment.DOMAIN_SUFFIX}

Это создаст HTTP API, API-шлюз и обернет его в Cognito Authorizer. Я хотел бы настроить второй сервис, который использует тот же авторизатор.

Я видел похожие вопросы, но ни один из них не касался HTTP API и общего доступа к Cognito Authorizer. Полезные ссылки:
https://seed.run/blog/how-to-structure-a-real-world-monorepo-serverless-app.html.
https://github.com/seed-run/serverless-template-monorepo.

...