我可以使用CloudFormation设置AWS Cognito用户池身份提供程序吗?

22

我想设置一个Cognito用户池,并使用CloudFormation yml文件自动配置我的Google身份提供程序。

我查阅了所有文档,但没有找到任何与此类似的内容。有什么想法吗?

enter image description here


你找到了什么东西吗? - balsick
很遗憾,可能需要向AWS论坛或客户服务咨询。我进行了大量搜索,我相信这是不可能的。 - sigmaxf
3
AWS论坛在CloudFormation方面并不是非常活跃。 正如您所看到的,StackOverflow也是如此。 我几周前在AWS论坛上发布了一个有关将API网关与步骤函数集成到CloudFormation中的问题,但没有人回答。 尽管如此,您仍然可以尝试提问。 - balsick
1
对于服务相关的问题,那里并没有太多帮助。只有拥有高级支持的人才能向他们提问,可惜我不是其中之一。 - sigmaxf
4个回答

15

2019年10月,UserPoolIdentityProvider被添加到了官方文档中。

您的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声明之前放置此声明,否则对我无效。 - marchinram
如果您的用户池客户端没有密钥,您应该放什么? - Yu Chen

3

2
你可以使用 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

请注意,此仓库是使用Serverless框架构建的。如果您希望使用纯CloudFormation堆栈构建此项目,请使用文件CUPIdentityProvider.js中的代码创建自定义资源。

1

使用通用自定义资源提供程序, 您可以创建所有CFN不支持的资源。

这里给出的示例特别是为了创建和配置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应用程序ID应用程序密钥授权范围。另外,AttributeMapping可能需要设置为其他内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接