Получите доступ к авторизованному API Congito AppSync из функции Lambda - PullRequest
0 голосов
/ 16 января 2019

Я хочу вызывать мутации в моем AppSync API из функций Lambda в ответ на внешние события.Теперь я смог сделать это, если я настрою AppSync на использование авторизации IAM, а затем предоставлю доступ в роли моей функции Lambda.Проблема в том, что мне нужно использовать авторизацию Cognito, потому что мне нужен доступ к именам пользователей Cognito во многих моих шаблонах распознавателя, и я не знаю ни одного способа сделать это при использовании авторизации IAM.

Поэтому я бы хотелзнать, есть ли способ авторизовать лямбда-функцию с помощью пользовательских пулов Cognito для вызова моей конечной точки AppSync.Очевидно, что я могу создать фиктивного пользователя в своем пуле и просто войти в него с помощью Lambda, но вход в Cognito User Pool - очень медленный процесс, и этот метод все равно звучит неправильно.Мутации, которые я хочу вызвать из Lambdas, в любом случае не нуждаются в информации Cognito.

Что также решило бы мою проблему, если бы у меня был способ доступа к имени пользователя Cognito в шаблонах распознавателя при использовании авторизации IAM.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Используя пулы пользователей в качестве механизма аутентификации, невозможно получить токены для авторизации с помощью AWS AppSync без входа в систему в какой-то момент.С учетом сказанного, вы можете немного уменьшить накладные расходы.В конечном счете, все сводится к тому, что вы предложили в своем вопросе, используя «фальшивого пользователя».Это не редкое решение, включающее в себя наличие пользователя уровня администратора, учетные данные которого будут доступны только с этой лямбды.

Прежде всего, я бы рекомендовал вам не использовать традиционный вход в систему SRP по причинам задержки,В качестве альтернативы можно использовать AdminInitiateAuth / ADMIN_NO_SRP_AUTH, чтобы переложить накладные расходы на вычисления SRP с вашей лямбды на серверную часть Cognito с включенным ADMIN_NO_SRP_AUTH в вашем пуле.Из вашего другого вопроса ( Authenticate AppSync request with adminInitiateAuth ) я понял, что вы задумывались об этом, однако важно отметить, что это просто другой API, используемый для входа пользователя. Вы можете прочитатьПодробнее об этом здесь: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-server-side-authentication-flow

Дополнительной альтернативой может быть пользовательский поток аутентификации.По той же ссылке, приведенной выше, есть более подробная информация о том, как это сделать, но вкратце вы можете настроить более быстрый поток, который будет соответствовать любым конкретным потребностям вашего добавления.

Чтобы немного увеличить накладные расходы, вы можете сохранитьэти жетоны в некоторой степени кэшированы.Это может означать просто сохранение его в памяти в Lambda и проверку его действительности / истечения перед использованием, или даже присоединение механизма удаленного кэширования.

0 голосов
/ 16 января 2019

@ Gerharddc, что если вы попытаетесь добавить политики, разрешающие неаутентифицированный доступ к вашему Cognito Identity Pool?

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

IdentityPoolUnauthorizedIAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Federated: cognito-identity.amazonaws.com
            Action:
              - sts:AssumeRoleWithWebIdentity
            Condition:
              StringEquals:
                cognito-identity.amazonaws.com:aud: !Ref CognitoIdentityPool
              ForAnyValue:StringLike:
                cognito-identity.amazonaws.com:amr: unauthenticated
      Policies:
        - PolicyName: CognitoUserSignInUnauthorizedPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - mobileanalytics:PutEvents
                  - mobiletargeting:PutEvents
                  - cognito-sync:*
                  - cognito-identity:*
                Resource: '*'

  IdentityPoolAuthorizedIAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Federated: cognito-identity.amazonaws.com
            Action:
              - sts:AssumeRoleWithWebIdentity
            Condition:
              StringEquals:
                cognito-identity.amazonaws.com:aud: !Ref CognitoIdentityPool
              ForAnyValue:StringLike:
                cognito-identity.amazonaws.com:amr: authenticated
      Policies:
        - PolicyName: CognitoUserSignInAuthorizedPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - mobileanalytics:PutEvents
                  - mobiletargeting:PutEvents
                  - cognito-sync:*
                  - cognito-identity:*
                Resource: '*'

  # Assigns the roles to the Identity Pool
  CognitoIdentityPoolRoleAttachment:
    Type: AWS::Cognito::IdentityPoolRoleAttachment
    Properties:
      IdentityPoolId: !Ref CognitoIdentityPool
      Roles:
        unauthenticated: !GetAtt IdentityPoolUnauthorizedIAMRole.Arn
        authenticated: !GetAtt IdentityPoolAuthorizedIAMRole.Arn

Когда я объявляю свой шаблон AWS AppSync, я добавляю шаблон , который позволяет пользователям получать доступ к моей конечной точке AppSync при входе в систему:

AppSyncIAMPolicy:
    Type: AWS::IAM::Policy
    Description: Allow user consume AppSync when signed in
    DependsOn: AppSyncGraphQLApi
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - appsync:GraphQL
            Resource:
              - !Join ['/', [!GetAtt AppSyncGraphQLApi.Arn, '*']]
      PolicyName: !Sub ${StackName}-appsync-iam-policy
      Roles:
        - !Sub ${IdentityPoolAuthorizedIAMRoleRef}

Моя точка зрения такова: вы можете прикрепить политику, которая разрешает пользователям not signed (без проверки подлинности) доступ к AppSync. Вместо - !Sub ${IdentityPoolAuthorizedIAMRoleRef} вы можете в шаблоне выше, вы можете попробовать - !Sub ${IdentityPoolUnauthorizedIAMRoleRef}.

Конечно, вы можете указать, какие конечные точки вы разрешите доступ без аутентификации, например:

AppSyncIAMPolicy:
    Type: AWS::IAM::Policy
    Description: Allow user consume AppSync when NOT signed in
    DependsOn: AppSyncGraphQLApi
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - appsync:GraphQL
            Resource:
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-1>
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-2>
      PolicyName: !Sub ${StackName}-appsync-iam-policy-unauthenticated
      Roles:
        - !Sub ${IdentityPoolUnauthorizedIAMRoleRef}
...