我正在编写一个 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
问题?