Cloudformation Cognito - как настроить параметры клиента приложения, домен и федеративные идентификаторы через шаблон SAM

У меня уже есть шаблон облачной среды пользовательского пула cognito, который интегрирован в мой api-шлюз. Но почему-то мне все же приходится вручную настраивать параметры клиента, домен и федеративные идентификаторы приложения, чтобы иметь рабочий портал входа для пользователей. Я смотрю здесь и там на возможные решения для автоматизации этих, но я не могу найти ничего близкого к нему.

Я хотел бы автоматизировать настройку настроек клиента, домена и федеративных идентификаторов через шаблон шаблона облаков, поэтому мне не нужно делать это вручную.

Любые предложения очень ценятся. Спасибо.

(вложения добавлены для дополнительной информации)

Ответ 1

Похоже, что нет способа обеспечить интеграцию приложений → Доменное имя и Федерация → Поставщики удостоверений через CloudFormation.

Я нашел только ссылку для клиента пула пользователей (Общие настройки → Клиенты приложения), но он не будет настраивать интеграцию приложения → Настройки клиента приложения.

Если вам необходимо автоматизировать процесс предоставления доменного имени, поставщиков удостоверений и параметров клиента приложения для пула пользователей, это можно сделать, создав собственный сценарий (AWS CLI) или Lambda (AWS SDK), который следует выполнить после развертывания стека.


ОБНОВИТЬ

Посмотрите отличный пример (ответ ниже), который показывает использование пользовательских ресурсов CloudFormation с Lambda.

Ответ 2

Я создал два пользовательских ресурса CloudFormation для применения настроек клиента приложения Cognito и имени домена. С этими ресурсами у вас может быть такой скрипт:

UserPoolTestClient:
  Type: 'AWS::Cognito::UserPoolClient'
  Properties:
    ClientName: UserPoolTestClient
    GenerateSecret: true
    UserPoolId: !Ref UserPoolTest
UserPoolTestClientSettings:
  Type: 'Custom::CognitoUserPoolClientSettings'
  Properties:
    ServiceToken: !GetAtt CloudFormationCognitoUserPoolClientSettings.Arn
    UserPoolId: !Ref UserPoolTest
    UserPoolClientId: !Ref UserPoolTestClient
    SupportedIdentityProviders:
      - COGNITO
    CallbackURL: 'https://www.amazon.com'
    LogoutURL: 'https://www.google.com'
    AllowedOAuthFlowsUserPoolClient: true
    AllowedOAuthFlows:
      - code
    AllowedOAuthScopes:
      - openid
UserPoolTestDomain:
  Type: 'Custom::CognitoUserPoolDomain'
  Properties:
    ServiceToken: !GetAtt CloudFormationCognitoUserPoolDomain.Arn
    UserPoolId: !Ref UserPoolTest
    Domain: 'userpool-test-01'

Полный код здесь.

Ответ 3

Я хочу добавить другое решение (предложенное Микаэлем), потому что CloudFormation сложно настроить; эта командная строка создаст ваш домен после создания стека CloudFormation:

 aws cognito-idp create-user-pool-domain --domain test-domain --user-pool-id eu-west-1_xxxxxxxx 

В вашем автоматическом развертывании вы можете добавить скрипт, который устанавливает ваш домен. Не так хорошо, как все на CF, но это работает

Ответ 5

Очень вдохновлен примером Росберга Линхареса, но на python и с использованием модуля AWS cfn helper :

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

from crhelper import CfnResource
import boto3
from copy import copy

# setup the cfn helper 
helper = CfnResource()
client = boto3.client('cognito-idp')

# these wrappers return the function unaltered, so we can chain them to apply
# the function in both create and update
@helper.create
@helper.update
def update_on_create(event, _):

        params = copy(event['ResourceProperties'])
        del params['ServiceToken']

        client.update_user_pool_client(**params) 

# don't do anything on delete. Deleting the client app is handled by the template
@helper.delete
def delete_user_pool_client(event, _):
        pass


def handler(event, context):
    helper(event, context)

Тогда ваша облачная информация будет похожа, например,

UserPoolClient:
    Type: AWS::Cognito::UserPoolClient
    Properties:
      ClientName: 'TestClient'
      GenerateSecret: true
      UserPoolId: !Ref UserPool
  UserPoolClientSettings:
    Type: Custom::CognitoUserPoolClientSettings
    DependsOn: 
        - LambdaForAppClientSettings
        - UserPoolClient
    Properties:
      ServiceToken: !GetAtt LambdaForAppClientSettings.Arn
      UserPoolId: !Ref UserPool
      ClientId: !Ref UserPoolClient
      CallbackURLs: 
          - https://www.amazon.com
      SupportedIdentityProviders:
          - COGNITO 

С возможным преимуществом, вы можете указать некоторые или все аргументы для update_user_pool_client(), благодаря расширению параметра в client.update_user_pool_client(**params). Вы должны убедиться, что ключи на карте Properties вашего пользовательского ресурса облачной информации в точности соответствуют требованиям boto3. Обратитесь к документации по boto3 для получения списка возможных аргументов.

Ответ 6

Со вчерашнего дня в AWS CloudFormation добавлена встроенная поддержка прямой настройки доменного имени, идентификаторов и других параметров: https://aws.amazon.com/about-aws/whats-new/2019/10/amazon-cognito-increases-cloudformation-support/

Эта новая поддержка включает в себя возможность безопасной и автоматической настройки домена размещенного пользовательского интерфейса, настройки настройки размещенного пользовательского интерфейса, настройки IdentityProvider, настройки поведения расширенных функций безопасности и настройки серверов ресурсов - все это непосредственно в CloudFormation.

(спасибо моему коллеге Бернхарду за это обновление)

Ответ 7

CloudFormation добавил ресурс AWS :: Cognito :: UserPoolDomain для управления доменом пула пользователей:

Type: AWS::Cognito::UserPoolDomain
Properties: 
  CustomDomainConfig: 
     CertificateArn: !Ref CertificateArn
  Domain: "your.custom.domain.com"
  UserPoolId: !Ref UserPool

Кроме того, была добавлена конфигурация для AWS :: Cognito :: UserPoolClient:

Type: AWS::Cognito::UserPoolClient
Properties: 
  AllowedOAuthFlows: 
    - String
  AllowedOAuthFlowsUserPoolClient: Boolean
  AllowedOAuthScopes: 
    - String
  AnalyticsConfiguration: 
    AnalyticsConfiguration
  CallbackURLs: 
    - String
  ClientName: String
  DefaultRedirectURI: String
  ExplicitAuthFlows: 
    - String
  GenerateSecret: Boolean
  LogoutURLs: 
    - String
  ReadAttributes: 
    - String
  RefreshTokenValidity: Integer
  SupportedIdentityProviders: 
    - String
  UserPoolId: String
  WriteAttributes: 
    - String