如何处理Cognito谷歌身份提供商缺失必填属性的问题
如何处理Cognito谷歌身份提供商缺失必填属性的问题
我之前也踩过一模一样的坑,咱们完全可以通过Cognito自带的用户属性补充流程来解决,不用被迫修改必填属性的设置,具体可以分这几步来操作:
1. 配置Cognito属性补充基础规则
首先得让Cognito知道,当用户缺失必填属性时,要跳转到咱们自己做的页面去收集信息:
- 如果用AWS控制台操作:进入你的Cognito用户池,找到「应用集成」→「应用客户端设置」,在「属性补充」板块勾选「允许用户补充缺失的属性」,然后填上你准备用来收集属性的页面URL(比如
https://你的域名.com/auth/complete-profile)。 - 如果用CloudFormation的话,要在用户池客户端的配置里,把这个补充页面的URL加到
CallbackURLs里,同时确保用户池的属性Schema里,必填的family_name等属性是可修改的(Mutable: true)。给你补一段关键的CloudFormation代码参考:
UserPool: Type: "AWS::Cognito::UserPool" Properties: UserPoolName: !Sub ${EnvironmentName}-***-user-pool Schema: - Name: email Required: true Mutable: true - Name: given_name Required: true Mutable: true - Name: family_name Required: true Mutable: true # 其他原有配置... UserPoolClient: Type: "AWS::Cognito::UserPoolClient" Properties: UserPoolId: !Ref UserPool ClientName: !Sub ${EnvironmentName}-***-user-pool-client CallbackURLs: - "https://你的域名.com/auth/callback/cognito" - "https://你的域名.com/auth/complete-profile" # 新增属性补充页面URL AllowedOAuthFlows: - code # 对应你的OAuth授权流程,比如code流 AllowedOAuthScopes: - email - openid - profile AllowedOAuthFlowsUserPoolClient: true # 其他原有配置...
2. 开发属性补充页面
接下来要做一个简单的前端页面,用来收集用户缺失的属性:
- 当Cognito发现用户缺失属性时,会自动把用户重定向到你刚才配置的页面,同时URL里会带
error=invalid_request、error_description=attributes required: [family_name]以及session参数(这个是Cognito的临时会话标识,非常重要)。 - 你的页面要先解析这些参数,把缺失的属性列出来(比如从
error_description里提取family_name),然后显示一个表单让用户输入对应的内容。 - 用户填完之后,调用Cognito的
UpdateUserAttributesAPI(或者用Amplify这类SDK的对应方法),传入session参数和用户补充的属性值。 - 调用成功后,Cognito会自动完成用户的注册流程,然后把用户重定向回你原来的回调URL,正常完成登录。
3. 可选:用Lambda触发器做自定义校验
如果需要对用户补充的属性做额外验证(比如检查格式、长度),可以给用户池加一个PreSignUp或者PreTokenGeneration Lambda触发器,在属性提交后、正式完成注册前做校验,不符合要求的话可以返回错误提示用户重新输入。
这样设置好之后,再遇到谷歌账号缺失必填属性的用户,就不会直接报错了,而是引导用户补充完信息再完成登录,完全符合你想要的流程。
备注:内容来源于stack exchange,提问作者Zog
相关产品推荐
相关产品推荐

