Cognito 访问令牌中的自定义属性

Yus*_*suf 6 amazon-web-services amazon-cognito aws-sdk aws-lambda

我对 AWS 比较陌生,因此我对此缺乏了解可能是我不明白为什么这不起作用的原因。但是,我已经在网络和文档中查找了解决方案(几天了);由于我仍然不明白的原因,这些解决方案在我的情况下不起作用。

我遇到的问题是我的用户设置了这些自定义属性,这些属性在验证用户身份时不存在于 jwt access_token 中:

这些是我在令牌中需要的自定义属性。 在此输入图像描述

但是,当使用以下命令在我的 Express 后端对用户进行身份验证时@aws-sdk/client-cognito-identity-provider

const pool = await this._awsCognitoService
    .initiateAuth({
        AuthFlow: "USER_PASSWORD_AUTH",
        ClientId: process.env.CLIENT_ID,
        AuthParameters: {
            USERNAME: data.email,
            PASSWORD: data.password,
        },
    });
Run Code Online (Sandbox Code Playgroud)

解码 AccessToken 后,我的自定义属性都不存在。

因此,我添加了用于预令牌生成的 lambda 函数触发器(https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token- Generation.html ) 在此输入图像描述

代码如下所示:

exports.handler = (event, context, callback) => {
    event.response = {
        "claimsOverrideDetails": {
            "claimsToAddOrOverride": {
                "custom:branch_id": event.request.userAttributes["custom:branch_id"],
                "custom:company_id": event.request.userAttributes["custom:company_id"],
            },
        },
    }
    
   callback(null, event)
};
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当用户进行身份验证(通过 Express 应用程序)时,预令牌生成 Lambda 函数会被触发。

但是,从中检索的访问令牌initiateAuth(...)没有我设置要覆盖的那些属性。

我已经在读取和写入上设置了自定义属性的属性,所以这不是问题。(https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html在此输入图像描述

我知道这与问题无关,但我别无选择,只能尝试。我已经启用了应用程序客户端设置上的所有属性,这样我就可以看到那些甜蜜的自定义属性,但仍然相同。令牌上不存在自定义属性。 在此输入图像描述

最初,所有这些复选框都未被选中。我将其恢复到初始状态,因为这对解决问题没有任何帮助。

任何帮助,将不胜感激

小智 8

据我了解,自定义属性仅作为客户端上 id 令牌的额外元数据提供,它与身份验证过程完全无关,或者存在于访问令牌的 JWT 令牌中。访问令牌有效负载包含有关经过身份验证的用户的声明,而不是自定义添加的属性。您可以参考此内容来了解​​有关它们的更多信息。

以下是 AWS 文档中的示例 ID 令牌负载:

  {
      "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "aud": "xxxxxxxxxxxxexample",
      "email_verified": true,
      "token_use": "id",
      "auth_time": 1500009400,
      "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
      "cognito:username": "janedoe",
      "exp": 1500013000,
      "given_name": "Jane",
      "iat": 1500009400,
      "email": "janedoe@example.com".
      "jti": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "origin_jti": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
  }
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人想了解两者之间的区别,OKTA 有一个很好的段落:https://developer.okta.com/docs/guides/validate-id-tokens/overview/#id-tokens-与访问令牌对比 (3认同)