如何从带有身份池的Lambda中检索自定义JWT声明?



我有以下场景,我试图理解正确的方法来实现它。

我有Okta作为我的IDP。Amazon API网关,用于管理我的API和一些处理API请求的lambda。身份池用于向访问api的客户端提供AWS凭据。

当客户端访问API时,我需要lambda(处理请求)从DynamoDB获取数据,并根据特定于已登录到客户端的用户的一些属性对其进行过滤。例如,我需要使用API为客户检索帐户,但用户只能访问某些帐户,因此lambda应该过滤结果。

我正在考虑为Okta中的每个用户定义一些自定义声明。当客户端使用Okta进行身份验证时,它会收到一个带有这些声明的JWT令牌。它使用这个令牌从身份池中获取AWS凭据,以访问API。API将触发lambda。在这里,我想要检索声明并使用它们来过滤数据。

对如何实现这一点有什么想法吗?或者有更好的方法来解决这个问题?

谢谢。

对于这样的场景,我们可以使用Lambda授权器。请根据您的API类型参考以下文档之一。

  1. REST api
  2. HTTP api

(概念上两个Lambda Authorizers或多或少是相同的)

你要做的是:

  • 在Lambda Authorizer中验证传入的JWT(由Okta生成)。然后,仅当令牌有效时,执行以下步骤。
  • 根据自定义声明(您在Okta中为每个用户配置的),在Lambda Authorizer输出的context中创建一个键值对(如此处或此处所述)
  • 然后这些context详细信息可用于您的Lambda,它执行DB查找。这样你就可以进行过滤了。

API网关路由可以使用内置的JWT授权器进行授权,这是从令牌访问自定义声明的最简单方法。JWT授权器使用JWT声明更新事件中的requestContext,这些声明可以被集成到路由中的Lambda访问。

然而,lambda授权器将提供更多的灵活性(如@sampath-dilhan所建议的),例如,如果您想向上下文添加任何额外的属性。

{
"requestContext" : {
"accountId": "121212121",
"appid": "6adqwerk8",
"authorizer" : {
"jwt": {
"claims": {
"aud": "api://default",
.
.
.
"mycustomclaim": "customvalue"
},
"scopes": "xyz"
}
}
.
.
.
}
}

最新更新