如何在AWS Cognito回调中获取用户邮箱(SAML身份提供商场景)
解决AWS Cognito + PingOne SAML IdP发起登录时回调获取邮箱等属性的问题
我来帮你搞定这个问题!你遇到的是SAML身份提供商和Cognito集成时,自定义属性传递的常见场景,尤其是IdP发起的登录流程。要让邮箱这类参数出现在Cognito的回调里,得把三个核心环节配置到位,一步步来:
1. 先在PingOne里配置SAML断言,把邮箱属性发出来
- 登录PingOne管理后台,找到你和Cognito集成的那个SAML应用
- 找到「SAML Attributes」(或者类似命名的配置项),添加你要传递的属性:比如把PingOne里用户的邮箱字段(一般是
user.email)映射到SAML断言里的email属性(名称随便你,但要和后续Cognito的映射对应上) - 保存配置后,记得确认PingOne在生成SAML响应时,会把这个属性放进
<AttributeStatement>节点里——可以用SAML Tracer这类工具抓包验证一下,避免白忙活
2. 在Cognito用户池里配置属性映射,把SAML属性对应到用户池属性
- 打开AWS控制台,进入你的Cognito用户池
- 先去「属性」标签页,确保你要获取的属性(比如邮箱)已经启用:邮箱属于标准属性,直接勾选就行;如果是自定义属性,得提前创建(比如
custom:employeeId) - 转到「联邦身份提供商」标签页,找到你的PingOne SAML提供商,点击编辑
- 在「SAML属性映射」部分,添加映射规则:把PingOne发送的SAML属性名(比如刚才设的
email),对应到Cognito用户池的标准属性email - 别忘了勾选「允许在身份验证期间更新用户池属性」,这样每次登录都会同步最新的属性值
- 保存映射配置
3. 检查Cognito应用客户端的OAuth配置,确保属性能被传递
- 进入用户池的「应用客户端」标签页,找到你的Web应用对应的客户端
- 去「应用客户端设置」里,确认「允许的OAuth范围」包含了
email(如果是自定义属性,范围就是custom:xxx) - 同时确保启用的OAuth流和你IdP发起的流程匹配(一般授权码流或隐式流都支持IdP发起)
4. 在Web应用里获取属性的正确姿势
- 如果用的是授权码流:回调后拿到授权码,去Cognito的令牌端点换取ID Token和Access Token。ID Token是JWT格式,解码后就能看到
email这类属性 - 如果用的是隐式流:ID Token会直接出现在回调URL的
id_token参数里,解码即可 - 另外,也可以用Access Token调用Cognito的
GetUserAPI,获取用户的完整属性列表
踩过的坑给你提个醒
- 一定要验证SAML断言里确实包含了目标属性:很多时候问题出在PingOne没把属性发出来,而不是Cognito没处理
- 属性名要严格匹配:SAML断言里的属性名和Cognito映射里的名称大小写、拼写必须完全一致
- 回调URL要对齐:PingOne里配置的ACS URL必须和Cognito应用客户端里的回调URL完全相同,否则可能会导致属性丢失或者登录失败
内容的提问来源于stack exchange,提问作者nitesh jha
相关产品推荐
相关产品推荐

