使用Google登录时Cognito为何无法获取/展示Email属性?
解决Amplify Authenticator Google登录的两个问题
问题1:Google登录后Cognito Email字段为空且未验证
原因分析
Google OAuth默认可能未请求email权限,或者Cognito未正确将Google返回的email属性映射到用户池的Email字段,也未设置自动标记邮箱为已验证状态。
解决步骤
确保Google OAuth请求了email权限
在Cognito控制台的「身份提供商」->「Google」配置中,确认「授权范围」包含email和profile。如果通过Amplify CLI配置,检查amplifyconfiguration.json里Google的scopes配置:"google": { "clientId": "YOUR_GOOGLE_CLIENT_ID", "scopes": ["email", "profile", "openid"], ... }配置Cognito属性映射
进入Cognito用户池->「身份提供商」->「Google」,点击「编辑属性映射」:- 将Google的
email属性映射到Cognito用户池的Email字段 - 勾选该映射项的「验证」选项(Google返回的邮箱均为已验证状态,Cognito会自动将
Email-verified设为true)
- 将Google的
验证属性同步结果
重新用Google登录后,查看Cognito用户详情,确认Email字段已填充且Email-verified为true。若仍有问题,可在登录后通过Amplify API手动获取用户属性排查:import { Auth } from 'aws-amplify'; // 登录成功后调用 const user = await Auth.currentAuthenticatedUser(); console.log(user.attributes.email); // 应正常输出邮箱
问题2:同一邮箱可通过Google和邮箱方式重复注册
原因分析
Cognito默认不会自动关联同一邮箱的社交账号与邮箱账号,需开启用户链接功能并设置唯一属性约束。
解决步骤
设置Email为唯一必填属性
进入Cognito用户池->「属性」,将Email设为「必填」并勾选「唯一」选项。开启社交账号与现有用户链接
在Cognito用户池->「身份提供商」->「Google」中找到「用户链接」选项:- 选择「链接到现有用户」
- 匹配属性选择
Email,这样用户用Google登录时,若邮箱已存在于用户池,会自动关联到现有账号,而非创建新用户。
测试重复注册场景
使用已通过邮箱注册的账号尝试Google登录,应直接登录到现有账号,不会生成新用户。
内容的提问来源于stack exchange,提问作者Nir
相关产品推荐
相关产品推荐

