0

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

4

1 回答 1

0

好问题 - 这是我将采取的方法:

代币

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

根据本文,这些是新的并且不支持自定义授权者。

于 2020-07-03T12:15:08.247 回答