AWS Cognito创建的ID_TOKEN中未传递自定义属性

37

我无法在用户成功登录后从AWS Cognito返回的ID_TOKEN中获取自定义属性

我尝试过的步骤:

1.创建用户池 2.创建应用程序客户端并检查自定义属性(customattrib1,customattrib2

用户池屏幕:

enter image description here

检查应用客户端配置中的自定义属性

enter image description here

3.使用admin-create-user API创建用户

下图显示了用户属性的值:

enter image description here

4. 在客户端应用程序中使用aws-cognito-auth.js登录用户。返回的ID令牌不包含自定义属性。

ID_TOKEN

{
  "at_hash": "PKfjYDaiEty5mUOyJZlPQA",
  "sub": "639d5016-2bd3-4c6f-b82d-21ae38071b09",
  "email_verified": true,
  "iss": "https://cognito-idp.ap-south-1.amazonaws.com/ap-south-1_XXXXXXX",
  "phone_number_verified": true,
  "cognito:username": "testuser",
  "aud": "XYXYXYXYX",
  "token_use": "id",
  "auth_time": 1549349674,
  "phone_number": "##########",
  "exp": 1549353274,
  "iat": 1549349674,
  "email": "testuser@somedomain.com"
}

我已经检查了下面的链接,其中包含一些关于这个问题的信息,但是到目前为止没有什么帮助。

在池创建后添加Cognito自定义属性?

如果用户池配置了SAML身份提供程序,则Cognito用户池自定义属性不会显示在ID令牌中

如果用户池配置了SAML身份提供程序,则Cognito用户池自定义属性不会显示在ID令牌中

https://www.reddit.com/r/aws/comments/a07dwg/cognito_add_custom_attribute_to_jwt_token/

请帮我确定是否有遗漏的内容..


1
自定义属性只有在被赋值后才会显示。您在创建的自定义属性中添加了值吗? - A.Khan
@AtharKhan 是的,这些值是在创建用户时提供的,我已经更新了问题描述,添加了显示用户属性值的图像。 - Mahesh_Loya
你确定用于令牌生成的应用程序客户端ID是你分配可读/可写权限的那个吗? - A.Khan
@AtharKhan 是的,只有一个应用程序客户端,我已经标记了属性并粘贴了屏幕截图。 - Mahesh_Loya
4个回答

62
  • 在您的Cognito用户池中,转到“常规设置”->“应用程序客户端”,然后针对每个应用程序客户端单击“显示详细信息”,然后单击“设置属性读取和写入权限”。 在“可读属性”下面勾选您的属性名称旁边的复选框。
  • 在您的Cognito用户池中,转到“应用程序客户端设置”->“允许的OAuth范围”,并启用“profile”范围。

9
一个额外的附加项:请确保如果您正在使用托管的UI URL,则URL包含profile作为范围参数的一部分:即&scope=email%20openid+profile。仅在应用程序客户端设置中设置此内容是不够的,它还必须包含在托管的UI请求参数中,否则它将不会作为jwt负载的一部分返回。 - Copy and Paste
1
如果有人正在寻找CDK解决方案,那么cognito.UserPoolClient具有readAttributes属性。创建它的方式是(new cognito.ClientAttributes()).withCustomAttributes("custom:something"),但是存在一个错误,即withCustomAttributes会创建一个新对象而不是附加到自己的对象上。 - Townsheriff

15

我曾经遇到同样的问题,当我在寻找解决方法时,你的问题也出现了。

当我在'应用程序客户端设置'中启用档案作用域后,我的自定义属性开始出现在ID令牌中。(可在AWS控制台-> '用户池'-> 点击您的池-> '应用程序客户端设置'-> '允许OAuth范围'中找到)

(顺便说一下: 我被文档中的这句话误导了:" openid 作用域返回ID令牌中客户端可读取的所有用户属性"。在我的情况下, openid 作用域是不够的。)


更新了文档,现在内容为:“profile 范围授权访问客户端可读取的所有用户属性。此范围只能与 openid 范围一起请求。” - mana

2

对于使用 Amplify SDK 的用户,像 OP 一样复制和粘贴调用时需要注意一个重要点,即您的客户端还需要明确请求范围。

在我的情况下,我正在使用 Angular。在将“profile”添加到用户池的“允许的 OAuth 范围”中之后,您还需要在客户端配置中指定它:

enter image description here


0
对我来说,问题在于我从以下位置获取我的令牌(在使用Amplify js库进行身份验证后):
Auth.currentSession().then(u => u.getAccessToken().getJwtToken())

改为:

Auth.currentSession().then(u => u.getIdToken().getJwtToken());

修改后,工作正常!希望能对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接