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, но это работает
Ответ 4
Я разработал решение для этих трех ресурсов для себя и других, которые хотят попробовать его. https://github.com/cyrfer/cloudformation-custom-resource-provider
Ответ 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