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 模板来验证这一点
我正在为 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 模板来验证这一点