web-dev-qa-db-fra.com

Puis-je configurer des fournisseurs d'identité de pool d'utilisateurs AWS Cognito avec Cloudformation?

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?

enter image description here

19
raphadko

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

Cloudformation Cognito - comment configurer les paramètres du client d'application, le domaine et les identités fédérées via le modèle SAM

3
Jens Roland

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.

2
Qassim Al-Shakhoori

À 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, à savoir Google app ID, App secret et Authorize scope. De même, AttributeMapping devra peut-être être défini sur autre chose.

1
ab77