oauth-2.0 - 命令行工具应如何使用 Okta OAuth 令牌对 AWS HTTP API 进行身份验证超过一小时?
问题描述
我正在编写一个 CLI 工具,该工具可以访问 AWS Lambda 托管的服务,通过 AWS HTTP API网关进行访问。API 网关配置为使用其对JWT 授权方的支持来验证客户端。
我使用的 IdP 是 Okta。如果我将从 Okta 收到的ID 令牌传递给 API GW,那么应该如何配置 API GW 就很清楚了。这是一个示例令牌:
{
"sub": "00urlzgj2EXAMPLE",
"ver": 1,
"iss": "https://example.oktapreview.com/oauth2/default",
"aud": "0oarluqjl0EXAMPLE",
"iat": 1593770403,
"exp": 1593774003,
"jti": "ID.vCYIDVfYjcwohRvoP79EXAMPLE",
"amr": ["pwd", "otp", "mfa"],
"idp": "0oa1gay7eWJEXAMPLE",
"nonce": "mynonce",
"auth_time": 1593770400,
"c_hash": "m6IADKIwnRdwEXAMPLE"
}
鉴于此,我知道我应该使用以下 CloudFormation 来定义我的 API:
Api:
Type: AWS::Serverless::HttpApi
Properties:
Auth:
Authorizers:
Okta:
IdentitySource: $request.header.Authorization
JwtConfiguration:
issuer: https://example.oktapreview.com/oauth2/default
audience: [0oarluqjl0EXAMPLE]
请注意,这aud
是我的应用程序所独有的,即它是 Okta 中应用程序的“客户端 ID”。
上述方法有效,但 ID 令牌在 Okta 中的生命周期限制为 1 小时,并且无法更改。我希望我的 CLI 能够拥有至少持续一个工作日的令牌。这也感觉像是对 ID 令牌的滥用,因为这就是访问令牌的用途,对吧?Okta 允许您配置访问令牌的到期时间 - 完美!但是有一个问题。访问令牌如下所示:
{
"ver": 1,
"jti": "AT.6OrUpPP_OmIPayrEzetEXAMPLE",
"iss": "https://example.oktapreview.com/oauth2/default",
"aud": "api://default",
"iat": 1593771163,
"exp": 1593779763,
"cid": "0oarluqjl0EXAMPLE",
"uid": "00urlzgj2EXAMPLE",
"scp": ["openid"],
"sub": "me@example.com"
}
这很好,从技术上讲它有效,但我担心aud
存在api://default
。观众不应该是我的 API吗?否则,如何阻止用户为我的 Okta 安装的其他客户端获取有效的访问令牌并将其与我的 API 一起使用?
观众在 Okta 中是可配置的,但它是在每个授权服务器级别。每个授权服务器都可以有许多关联的客户端应用程序,这让我认为这没有“按预期”使用 Okta。在 Okta 中将授权服务器与应用程序进行 1:1 映射似乎并不正确。
API GW 文档说他们会检查aud
or client_id
,但是 Okta 在该字段中指定了我的应用程序的客户端 ID -cid
所以这对我没有好处。
我错过了什么?我应该发送id_token
到 API GW 吗?如果是这样,访问令牌甚至是为了什么?如果是这样,为什么 Okta 将这些限制为一个小时而不是访问令牌?如果我应该使用访问令牌,我该如何解决这个一般aud
问题?
解决方案
好问题 - 这是我将采取的方法:
代币
id 令牌对您的 CLI 工具是私有的,不应发送到 API 网关。而是发送访问令牌。也许只是 AWS 文档引用了 id 令牌,但也支持访问令牌?
控制客户端对 API 的访问
一种选择是使用受众,尽管正如您所指出的,这通常是一个全局值。另一种选择是使用自定义范围来表示高级访问。例如,您可能有 3 个入口点 API,并且颁发给您的 CLI 工具的令牌可能具有“销售”范围,这意味着它只能调用该 API:
- 订单
- 销售量
- 报告
向授权人添加所需范围
看起来您应该能够将“范围”属性添加到您的 CloudFormation。
尝试发送访问令牌
Okta 将这些作为 JWT 发布,它应该适合 HTTP API 使用的令牌验证,该验证基于从 JWKS 端点下载令牌签名密钥
自定义 AWS 授权人
为了进行更精细的控制,请使用 Rest API 并为执行以下步骤的 Sales API 构建自定义 lambda 授权器:
- 验证令牌和预期受众
- 验证“销售”范围是否存在,否则拒绝呼叫
索赔缓存
令牌验证完成后,无论您是否使用自省,AWS 都会将声明缓存在策略文档中。自定义授权者将使您能够在声明缓存中包含自定义数据,这通常很有用。
我的一些相关资源
HTTP API
根据本文,这些是新的并且不支持自定义授权者。
推荐阅读
- css - CSS 实验特性的使用 --> element.pseudo();
- spring - Liberty Server 安装后不显示
- express - 在快速错误对象中找不到猫鼬验证错误
- spring - 如何将@NamedEntityGraph 与@EmbeddedId 一起使用?
- arrays - 无法将 NULL 指针传递给数组
- php - Laravel 5.5 不会使用 PHP 7.4 呈现电子邮件
- mysql - 在 mysql 8 中加入表
- c - 如何在现有文件中获取 HDF5 块尺寸?
- embedded-linux - Yocto - Warrior - 如何创建 wic 镜像安装程序
- c# - 在运行时更改字体真棒图标类