CDK 如何在 Cognito Callback URL 中使用默认生成的 Cloudfront Distribution URL?

CDK How to use the default generated Cloudfront Distribution URL in Cognito Callback URL?

我正在为 S3 中的静态托管网站设置 CloudFront 分发。对于身份验证,我使用托管 UI 的 Cognito 用户池进行身份验证。我想使用 CloudFront Distribution 域名并将其分配给 Cognito Callback URL 进行登录。但是,我无法使用随机生成的 CloudFront 分发域名并将其关联到回调 URL,因为它是在创建时实例化的。我能看到的唯一解决方法是创建 CloudFront 分发的证书。这对我不起作用,因为我的解决方案需要使用 CloudFront 分发域名。你会如何解决这个问题?这是我的代码:

   cd = cloudfront.Distribution(self, "myDist",
        default_root_object='index.html',
        default_behavior=cloudfront.BehaviorOptions(
            origin=origins.S3Origin(website_bucket, origin_access_identity=oai), 
            viewer_protocol_policy=cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS)
    )

    pool = cognito.UserPool(self, 
    "pool",
    user_invitation=cognito.UserInvitationConfig(
        email_subject="Invite to join our awesome app!",
        email_body="Hello {username}, you have been invited to join our awesome app! Your temporary password is {####}",
        sms_message="Hello {username}, your temporary password for our awesome app is {####}"
    ),
    mfa=cognito.Mfa.REQUIRED,
    mfa_second_factor=cognito.MfaSecondFactor(
        sms=True,
        otp=True
    ),
    sign_in_aliases=cognito.SignInAliases(
            username=True,
            email=True
        )
    )

    pool.add_client("app-client",
    o_auth=cognito.OAuthSettings(
        flows=cognito.OAuthFlows(
            authorization_code_grant=True,
            implicit_code_grant=True
        ),
        scopes=[cognito.OAuthScope.OPENID],
        callback_urls=[str(cd.domain_name)],
        logout_urls=["https://my-app-domain.com/signin"]
        )
    )

只需使用 cd.domain_name,无需强制转换为 str。在您的 Python 代码中,cd.domain_name 是 synth-time* 处的字符串 Token value. The CDK will translate the Token into a CloudFormation ref 内函数。 CloudFormation 在 deploy-time.

处处理值解析

如果 callback_urls 参数需要协议前缀,您可以使用 Python 字符串插值,或者如果 CDK 的自动解析失败(罕见),显式传递所需的 CloudFormation intrinsic function

# CDK will turn this into a Join and Ref intrinsic function
callback_urls=[f'https://{cd.domain_name}'],

# Is equivalent To:
callback_urls=[Fn.join('', ['https://', cd.domain_name])],

* 当您 运行 cdk synth.

时,您可以通过检查在 cdk.out 目录中创建的 CloudFormation 模板来验证这一点