【问题标题】:Custom attributes in Cognito Access TokenCognito 访问令牌中的自定义属性
【发布时间】:2021-09-17 20:00:04
【问题描述】:

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

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

这些是我在令牌中需要的自定义属性。

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

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

解码 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)
};

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

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

我已经为读写的自定义属性设置了属性,所以这不是问题。 (https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html)

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

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

任何帮助将不胜感激

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-sdk amazon-cognito


    【解决方案1】:

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

    这里是 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"
      }
    

    【讨论】:

    • 谢谢你的回答,我找到了背后的原因!我将令牌设置为 AccessToken 而不是 IdToken。 AccessToken 不允许 jwt 中的自定义属性。更改后,我现在可以看到自定义属性了!我会将您的答案标记为正确。
    • 如果还有人想知道两者有什么区别,OKTA 上面有一段很好的说明:developer.okta.com/docs/guides/validate-id-tokens/overview/…
    • @Yussuf 配置 IdToken 与 AccessToken 需要进行哪些设置/配置?
    • @EmAe 我不认为我必须做任何不同的事情。当用户通过身份验证时,我刚刚更改了从pool.AuthenticationResult.IdToken 获取令牌的位置。
    猜你喜欢
    • 2019-11-20
    • 2021-04-25
    • 2018-03-25
    • 1970-01-01
    • 2023-03-19
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多