Как создать Cognito IdentityPool с Cognito UserPool в качестве одного из провайдеров аутентификации с использованием aws cdk? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь создать Cognito FederatedIdentityPool с CognitoUserPool в качестве одного поставщика аутентификации.Создать UserPool было достаточно просто:

    const userPool = new cognito.CfnUserPool(this, 'MyCognitoUserPool')
    const userPoolClient = new cognito.CfnUserPoolClient(this, 'RandomQuoteUserPoolClient', {
      generateSecret: false,
      userPoolId: userPool.userPoolId
    });

Однако я не уверен, как подключить это к пулу удостоверений:

    const identityPool = new cognito.CfnIdentityPool(this, 'MyIdentityPool', {
      allowUnauthenticatedIdentities: false,
      cognitoIdentityProviders: ?????
    });

На основе Документация API IdentityProvider itпохоже, что есть свойство cognitoIdentityProviders, однако оно принимает массив cdk.Token/CognitoIdentityProviderProperty.

Теперь я попытался создать объект CognitoIdentityProviderProperty и передать его cognitoIdentityProviders: [{ clientId: userPoolClient.userPoolClientId }], но я получаюследующее исключение:

 1/2 | 09:48:35 | CREATE_FAILED        | AWS::Cognito::IdentityPool   | RandomQuoteIdentityPool Invalid Cognito Identity Provider (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: InvalidParameterException; Request ID: 4d6d579a-6455-11e9-99a9-85159bc87779)
        new CdkWorkshopStack (/Users/cdk/lib/cdk-workshop-stack.ts:46:26)
        \_ Object.<anonymous> (/Users/cdk/bin/cdk-workshop.ts:7:1)
        \_ Module._compile (module.js:653:30)
        \_ Object.Module._extensions..js (module.js:664:10)
        \_ Module.load (module.js:566:32)
        \_ tryModuleLoad (module.js:506:12)
        \_ Function.Module._load (module.js:498:3)
        \_ Function.Module.runMain (module.js:694:10)
        \_ startup (bootstrap_node.js:204:16)
        \_ bootstrap_node.js:625:3

Я даже пытался скопировать идентификатор из Консоли AWS и жестко запрограммировать его здесь, все та же ошибка.

  1. Может кто-нибудь помочь мне объяснить, как я могу настроить АутентификациюПоставщики в CfnIdentityPool.
  2. Почему существуют UserPool и CfnUserPool ?В чем разница между ними и какой из них предполагается использовать?

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Я смог понять, как подключить UserPool к пулу удостоверений

    const userPool = new cognito.CfnUserPool(this, 'MyCognitoUserPool')
    const userPoolClient = new cognito.CfnUserPoolClient(this, 'MyCognitoUserPoolClient', {
      generateSecret: false,
      userPoolId: userPool.userPoolId
    });

    const identityPool = new cognito.CfnIdentityPool(this, 'MyCognitoIdentityPool', {
      allowUnauthenticatedIdentities: false,
      cognitoIdentityProviders: [{
        clientId: userPoolClient.userPoolClientId,
        providerName: userPool.userPoolProviderName
      }]
    });

Все еще борюсь с подключением Role к IdentityPool и не знаю разницы между CfnUserPool и UserPool.Однако этот вопрос может быть помечен как частично решенный.

0 голосов
/ 23 июля 2019

Таким способом мне удалось имитировать конфигурацию по умолчанию, созданную через консоль aws, когда вы создаете пул удостоверений с пулом пользователей в качестве поставщика удостоверений.Он включает в себя некоторые другие функции помимо того, что вы просили (разрешает доступ без аутентификации и указывает политику паролей), но его легко изменить в соответствии с вашими потребностями.

    const userPool = new cognito.UserPool(this, 'MyUserPool', {
        signInType: SignInType.EMAIL,
        autoVerifiedAttributes: [
            UserPoolAttribute.EMAIL
        ]
    });
    const cfnUserPool = userPool.node.defaultChild as cognito.CfnUserPool;
    cfnUserPool.policies = {
        passwordPolicy: {
            minimumLength: 8,
            requireLowercase: false,
            requireNumbers: false,
            requireUppercase: false,
            requireSymbols: false
        }
    };
    const userPoolClient = new cognito.UserPoolClient(this, 'MyUserPoolClient', {
        generateSecret: false,
        userPool: userPool,
        userPoolClientName: 'MyUserPoolClientName'
    });
    const identityPool = new cognito.CfnIdentityPool(this, 'MyCognitoIdentityPool', {
        allowUnauthenticatedIdentities: false,
        cognitoIdentityProviders: [{
            clientId: userPoolClient.userPoolClientId,
            providerName: userPool.userPoolProviderName,
        }]
    });
    const unauthenticatedRole = new iam.Role(this, 'CognitoDefaultUnauthenticatedRole', {
        assumedBy: new iam.FederatedPrincipal('cognito-identity.amazonaws.com', {
            "StringEquals": { "cognito-identity.amazonaws.com:aud": identityPool.ref },
            "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" },
        }, "sts:AssumeRoleWithWebIdentity"),
    });
    unauthenticatedRole.addToPolicy(new PolicyStatement({
        effect: Effect.ALLOW,
        actions: [
            "mobileanalytics:PutEvents",
            "cognito-sync:*"
        ],
        resources: ["*"],
    }));
    const authenticatedRole = new iam.Role(this, 'CognitoDefaultAuthenticatedRole', {
        assumedBy: new iam.FederatedPrincipal('cognito-identity.amazonaws.com', {
            "StringEquals": { "cognito-identity.amazonaws.com:aud": identityPool.ref },
            "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" },
        }, "sts:AssumeRoleWithWebIdentity"),
    });
    authenticatedRole.addToPolicy(new PolicyStatement({
        effect: Effect.ALLOW,
        actions: [
            "mobileanalytics:PutEvents",
            "cognito-sync:*",
            "cognito-identity:*"
        ],
        resources: ["*"],
    }));
    const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment(this, 'DefaultValid', {
        identityPoolId: identityPool.ref,
        roles: {
            'unauthenticated': unauthenticatedRole.roleArn,
            'authenticated': authenticatedRole.roleArn
        }
    });

Почему существуют UserPool и CfnUserPool?В чем разница между ними и какой из них предполагается использовать?

UserPool - это высокоуровневое представление ресурса и предпочтительный способ работы, но еще не все свойства реализованы.CfnUserPool (любой префиксный класс Cfn) - это низкоуровневое представление, которое сопоставляется с ресурсом Cloudformation.Вы можете использовать оба, когда класс высокого уровня не удовлетворяет вашим потребностям, как в примере.

...