Je souhaite configurer un pool d'utilisateurs cognito et configurer mon fournisseur d'identité Google automatiquement avec un fichier yml cloudformation.
J'ai vérifié toute la documentation, mais je n'ai rien trouvé de proche à faire. Une idée sur la façon de le faire?
Il semble que beaucoup de détails Cognito ne soient pas pris en charge dans Cloudformation pour le moment, mais il existe des moyens d'obtenir ce que vous voulez après la rotation de la pile, par exemple en utilisant Lambdas.
Voir les réponses suivantes:
Impossible de définir une propriété du client cognito userpool via cloudformation
Vous pouvez y parvenir en utilisant la fonction Lambda en tant que ressources Cloudformation personnalisées. J'ai créé des ressources personnalisées pour permettre la création de domaine de pool d'utilisateurs, de paramètres client et de fournisseurs d'identité sur ce dépôt
Vous aurez quelque chose comme ça pour créer un fournisseur d'identité, par exemple Facebook
FacebookIdp:
Type: 'Custom::${self:service}-${self:provider.stage}-CUPIdentityProvider'
DependsOn:
- CFNSendResponseLambdaFunction
- CUPIdentityProviderLambdaFunction
Properties:
ServiceToken:
Fn::GetAtt: [CUPIdentityProviderLambdaFunction, Arn]
UserPoolId:
Ref: AppUserPool
ProviderName: Facebook
ProviderType: Facebook
Client_id: 'YourFacebookAppID'
Client_secret: 'YourFacebookAppSecert'
Authorize_scopes: 'public_profile,email'
Et puis activez ce fournisseur d'identité sur les paramètres du client du pool d'utilisateurs
AppUserPoolClientSettings:
Type: 'Custom::${self:service}-${self:provider.stage}-CUPClientSettings'
DependsOn:
- CFNSendResponseLambdaFunction
- CUPClientSettingsLambdaFunction
- FacebookIdp
Properties:
ServiceToken:
Fn::GetAtt: [ CUPClientSettingsLambdaFunction, Arn]
UserPoolId:
Ref: AppUserPool
UserPoolClientId:
Ref: AppUserPoolClient
SupportedIdentityProviders:
- COGNITO
- Facebook
CallbackURL: 'https://www.yourdomain.com/callback' ##Replace this with your app callback url
LogoutURL: 'https://www.yourdomain.com/logout' ##Replace this with your app logout url
AllowedOAuthFlowsUserPoolClient: true
AllowedOAuthFlows:
- code
AllowedOAuthScopes:
- openid
Notez que ce dépôt est construit en utilisant Framework sans serveur , si vous souhaitez le construire avec des piles de cloudformation pures, utilisez le code du fichier CUPIdentityProvider.js pour créer votre propre ressource personnalisée.
À l'aide d'un fournisseur de ressources personnalisé générique , vous pouvez créer toutes les ressources que CFN ne prend pas en charge.
L'exemple donné ici crée et configure spécifiquement l'authentification Cognito pour Google SAML.
Il devrait être assez facile de le modifier pour utiliser Google oAuth au lieu de SAML en modifiant les paramètres passés au gestionnaire de ressources personnalisé, par exemple.
UserPoolIdentityProvider:
Type: 'Custom::CognitoUserPoolIdentityProvider'
Condition: HasMetadata
DependsOn: UserPool
Properties:
ServiceToken: !Sub '${CustomResourceLambdaArn}'
AgentService: cognito-idp
AgentType: client
# https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cognito-idp.html#CognitoIdentityProvider.Client.create_user_pool_domain
AgentCreateMethod: create_identity_provider
AgentUpdateMethod: update_identity_provider
AgentDeleteMethod: delete_identity_provider
AgentResourceId: ProviderName
AgentCreateArgs:
UserPoolId: !Sub '${UserPool}'
ProviderName: google-provider
AttributeMapping:
email: emailAddress
ProviderDetails:
google_app_id: some_value
google_app_secret: some_value
google_authorize_scope: some_value
ProviderType: Google
AgentUpdateArgs:
UserPoolId: !Sub '${UserPool}'
ProviderName: google-provider
AttributeMapping:
email: emailAddress
ProviderDetails:
google_app_id: some_value
google_app_secret: some_value
google_authorize_scope: some_value
ProviderType: Google
AgentDeleteArgs:
UserPoolId: !Sub '${UserPool}'
ProviderName: google-provider
vous devrez créer un fournisseur de test dans la console pour obtenir les noms corrects des paramètres sous
ProviderDetails
, à savoirGoogle app ID
,App secret
etAuthorize scope
. De même,AttributeMapping
devra peut-être être défini sur autre chose.