我有以下场景,我试图理解正确的方法来实现它。
我有Okta作为我的IDP。Amazon API网关,用于管理我的API和一些处理API请求的lambda。身份池用于向访问api的客户端提供AWS凭据。
当客户端访问API时,我需要lambda(处理请求)从DynamoDB获取数据,并根据特定于已登录到客户端的用户的一些属性对其进行过滤。例如,我需要使用API为客户检索帐户,但用户只能访问某些帐户,因此lambda应该过滤结果。
我正在考虑为Okta中的每个用户定义一些自定义声明。当客户端使用Okta进行身份验证时,它会收到一个带有这些声明的JWT令牌。它使用这个令牌从身份池中获取AWS凭据,以访问API。API将触发lambda。在这里,我想要检索声明并使用它们来过滤数据。
对如何实现这一点有什么想法吗?或者有更好的方法来解决这个问题?
谢谢。
对于这样的场景,我们可以使用Lambda授权器。请根据您的API类型参考以下文档之一。
- REST api 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"
}
}
.
.
.
}
}