【问题标题】:Can I setup AWS Cognito User Pool Identity Providers with Cloudformation?我可以使用 Cloudformation 设置 AWS Cognito 用户池身份提供商吗?
【发布时间】:2018-08-29 22:38:40
【问题描述】:

我想设置一个认知用户池并使用 cloudformation yml 文件自动配置我的谷歌身份提供者。

我检查了所有文档,但找不到任何接近这样做的东西。有什么想法吗?

【问题讨论】:

  • 你发现了什么吗?
  • 很遗憾没有。也许问aws论坛或客户服务?我做了很多搜索,我相信这是不可能的
  • aws 论坛在 cloudformation 方面不是很活跃。如您所见,stackoverflow 也不是。几周前,我在 cloudformation 上问过一个关于集成 API 网关的问题,但没有人在这里或在 aws 论坛上回答。不过,你可以试试
  • 那里也没有太多帮助,有高级支持(服务相关问题)的人可以问他们,不幸的是不是我的情况

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

UserPoolIdentityProvider 于 2019 年 10 月添加,official docs

然后您的 CloudFormation 将类似于

CognitoUserPoolIdentityProvider:
  Type: AWS::Cognito::UserPoolIdentityProvider
  Properties: 
    ProviderName: Google
    AttributeMapping:
      email: emailAddress
    ProviderDetails:
      client_id: <yourclientid>.apps.googleusercontent.com
      client_secret: <yourclientsecret>
      authorize_scopes: email openid
    ProviderType: Google
    UserPoolId: 
      Ref: CognitoUserPool

【讨论】:

  • 这对我有用,但您必须将此声明放在 yml 文件中的 AWS::Cognito::UserPool 声明之前,否则对我不起作用
  • 如果您的用户池客户端没有秘密,您应该放什么?
【解决方案2】:

使用generic custom resource provider,您可以创建所有 CFN 不支持的资源。

here 给出的示例专门为 Google SAML 身份验证创建和配置 Cognito。

例如,通过更改传递给自定义资源处理程序的参数,将其更改为使用 Google oAuth 而不是 SAML 应该很容易。

  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

您需要在控制台中创建一个测试提供程序以获取ProviderDetails 下参数的正确名称,即Google app IDApp secretAuthorize scopeAttributeMapping 也可能需要设置为其他值。

【讨论】:

    【解决方案3】:

    您可以使用 Lambda 函数作为自定义 Cloudformation 资源来实现此目的。我已经制作了自定义资源,以允许在 this repo 上创建用户池域、客户端设置和身份提供程序

    您将拥有类似的东西来创建身份提供者,例如 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'
    

    然后在用户池客户端设置中启用该身份提供者

    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
    

    请注意,此 repo 是使用 Serverless framework 构建的,如果您希望使用纯 cloudformation 堆栈构建它,请使用文件 CUPIdentityProvider.js 上的代码来制作您自己的自定义资源。

    【讨论】:

      【解决方案4】:

      目前,Cloudformation 似乎不支持很多 Cognito 细节,但有一些方法可以在堆栈启动后实现您想要的,例如使用 Lambda。

      查看以下答案:

      Cannot set a property of cognito userpool client via cloudformation

      Cloudformation Cognito - how to setup App Client Settings, Domain, and Federated Identities via SAM template

      【讨论】:

        猜你喜欢
        • 2020-06-21
        • 2020-04-25
        • 2020-08-14
        • 2018-10-08
        • 2018-08-20
        • 1970-01-01
        • 2018-11-06
        • 2021-11-24
        • 2018-11-01
        相关资源
        最近更新 更多