AWS Cognito 预令牌生成不会向 ID 令牌添加自定义声明(使用 ALB 设置 + 身份验证代码流)



我正在使用"预令牌生成"触发器将自定义声明添加到 Cognito 的 ID 令牌。

问题

lambda 已触发,但颁发的 ID 令牌不包括我添加的声明。我错过了什么吗?

我的设置

  • 将 OAuth 2.0 与authorization code流结合使用
  • 我的客户端应用位于负载均衡器 (alb) 后面。alb与Cognito交互,以ALBSessionCookie的形式获取Access + ID令牌。与 [0] 非常相似
  • 为了获取 ID 令牌,客户端使用 ALBSessionCookie 调用我的后端的自定义终结点。后端使用该 Cookie 向用户返回解码的 ID 令牌。这是我希望应该包含自定义声明的 ID 令牌。

[0] https://www.exampleloadbalancer.com/auth_detail.html

Lambda 函数(令牌生成前触发器)

格式取自 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html#aws-lambda-triggers-pre-token-generation-example-1

exports.handler = (event, context, callback) => {
event.response = {
"claimsOverrideDetails": {
"claimsToAddOrOverride": {
"my-custom-claims-namespace": JSON.stringify({
"custom-claim-1": "hello",
"custom-claim-2": "hello",
})
}
}
}
callback(null, event)
}

如果我无法使用 ALB 进行此操作,有哪些解决方法?一些想法:

  • 直接调用 Cognito 以获取 ID 令牌(以某种方式),希望这将触发 lambda 使用自定义声明颁发 JWT
  • 通过AmplifyJS调用Cognito

我有一种感觉,这是预期的行为,尽管似乎是一个限制。看这里: https://www.exampleloadbalancer.com/auth_detail.html

我们可以看到以下步骤发生:

  • ALB 接收 JWT(ID 令牌、访问令牌)
  • 用于发送访问令牌的 ALB
  • ALB接收用户信息(索赔)

我相信 ALB 不会将解码 ID 令牌(由 Lambda 触发器操纵)的内容发送回后端,而是发送不受 Cognito 触发器影响的"用户信息(声明)"(从 UserInfo 端点返回)。

是的,ALB 不是这样工作的,Lambda触发器自定义的 ID 令牌是用户进行身份验证时获得的令牌。有几个选项。

自定义用户属性

侵入性最小的 IMO 如果不是在Lambda触发器中添加这些属性,您可以将它们作为Cognito中的自定义属性,我相信这些将在此令牌中。您可以在每次成功授权时同步这些属性。这可能符合您的要求。

原料药吉瓦

您可以在LB和APP之间或LB前面放置一个API GW。API GW确实为您提供了一个层,您可以在其中通过自定义标头,令牌等来执行所有这些操作以及更多操作。例如,您可以有一个 Lambda 授权方读取此访问令牌,并返回一个context,您可以在集成请求中将该引用回后端。它涉及更多,并且至少会为您的应用程序增加一些延迟,尽管您可以安全地在身份验证响应上拥有较大的 TTL,因为您的LB已经在执行身份验证,并且您只需要一些额外的属性。你也可以做一个重新设计,把这一切放在API GW,得到它所有的花里胡哨,但你可能不需要它们。

但是,如果可能的话,使用第一个选项可能是最容易的,因为这不需要您进行重新设计,您只需要将属性名称更改为custom:...

最新更新