API AWS Cognito и Websocket с использованием Lambda Authorizer

#amazon-web-services #aws-lambda #aws-api-gateway #lambda-authorizer #aws-jwt-authorizer

#amazon-веб-сервисы #aws-lambda #aws-api-gateway #лямбда-авторизатор #aws-jwt-authorizer

Вопрос:

У меня возникли проблемы при попытке настроить лямбда-авторизации для WebSocket API.

Бессерверный.yml

 functions:
  sample-web-socket-authorizer:
    iamRoleStatementsName: stack-${opt:stage}-web-socket-authorizer
    iamRoleStatementsInherit: true
    iamRoleStatements:
      - Effect: "Allow"
        Action:
          - 'cognito-idp:*'
        Resource: '*'
    handler: sample-web-socket-authorizer/handler.handler
    environment:
      JWK_URL: ${self:custom.jwkUrl}
      CLIENT_ID: ${self:custom.cognitoClientId}
  ...
  connectionHandler:
    handler: handler.connectionHandler
    events:
      - websocket:
          route: $connect
          authorizer:
            name: sample-web-socket-authorizer
            identitySource:
              - 'route.request.querystring.Authorizer'
  

во внешнем интерфейсе я хочу отправить tokenId или accessToken для использования в authorizer

 wss://abcd1234.execute-api.ap-region-1.amazonaws.com/pre?Authorizer=${token}
  

Ребята, пожалуйста, дайте мне пример кода с использованием python для создания lambda authorizer для моего websocket api.

В настоящее время я просматриваю эту статью: https://github.com/awslabs/aws-support-tools/blob/master/Cognito/decode-verify-jwt/decode-verify-jwt.py

Ответ №1:

Итак, что я делаю, так это буквально копирую этот код в свой обработчик авторизации: https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/blob/master/blueprints/python/api-gateway-authorizer-python.py

а затем основывайтесь на этом документе https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-lambda-auth.html

Я изменил код

 resourceArn = 'arn:aws:execute-api:{}:{}:{}/{}/{}/{}'.format(self.region, self.awsAccountId, self.restApiId, self.stage, verb, resource)        
  

Для

 resourceArn = self.methodArn
  

также вам необходимо указать methodArn в классе AuthPolicy, который выглядит следующим образом:

 class AuthPolicy(object):
    # The AWS account id the policy will be generated for. This is used to create the method ARNs.
    awsAccountId = ''
    # The principal used for the policy, this should be a unique identifier for the end user.
    principalId = ''
    # The policy version used for the evaluation. This should always be '2012-10-17'
    version = '2012-10-17'
    # The regular expression used to validate resource paths for the policy
    pathRegex = '^[/.a-zA-Z0-9-*] $'

    methodArn = '*'
    ....
  

И, наконец, при создании политики аутентификации добавьте значение methodArn, исходящее из лямбда-события:

 policy = AuthPolicy(principalId, awsAccountId)
        policy.restApiId = apiGatewayArnTmp[0]
        policy.region = tmp[3]
        policy.stage = apiGatewayArnTmp[1]
        policy.methodArn = event["methodArn"]
        policy.allowAllMethods()