php中文网

构建有效的 JWT 声明集

php中文网

简介

我需要审查一个拉取请求,该请求正在修复样本报告的问题,并且在测试通过时,感觉样本中肯定还有更多事情需要更改。

我了解 json web token(jwt 发音为“jots”)有一段时间了,但我不了解它们。看到这个 pr 让我有理由进一步深入研究它们。

什么是 jwt

jwt 是一种用于在各方之间安全传输信息的开放标准方法。它们通常用于验证用户身份并授权对资源的访问。它们由 3 部分组成:标头、有效负载和签名。

为什么需要 jwt

iam 服务账户凭证 api 创建短期凭证来模拟 iam 服务账户。 signjwt 方法将使用服务帐户的系统管理私钥对 jwt 进行签名。在signjwt方法的请求正文中,有效负载字段应包含一个序列化的json对象,该对象包含jwt声明集。

什么是智威汤逊声明

声明是 jwt 传输的核心信息。

以下是有效声明集的示例:

{
  "iss": "https://cloud.google.com/iam",
  "sub": "projects/-/serviceaccounts/my-service-account@my-project.iam.gserviceaccount.com",
  "aud": "https://my-iap-protected-app.example.com",
  "iat": 1694003600,
  "exp": 1694007200
}

此声明集包含以下字段:

  • iss:jwt 的颁发者,将进行身份验证的服务帐户,在本例中应该是服务帐户电子邮件。
  • sub:jwt 的用户主题,即服务帐户电子邮件。
  • aud:jwt 的受众,即受 iap 保护的资源的 url。
  • iat:issued at time,即生成jwt的时间。这必须是 utc 格式的整数。
  • exp:过期时间,即jwt将不再有效的时间。 cloud iam 记录了其他限制:不能是过去的时间,也不能是未来超过 12 小时的时间。

通过将这些声明包含在 jwt 的有效负载中,您可以确保其有效并可用于访问受 iap 保护的资源。

关于那个公关

原始代码看起来像

    iat = datetime.datetime.now(tz=datetime.timezone.utc)
    exp = iat + 3600
    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": iat,
            "exp": exp,
        }
    )

我知道测试出了问题,但我不想阻止解决此代码的根本问题。

公关作者提交了更改

iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()

这似乎是一个不完整的修复。根据 api 的文档,我意识到提交的修复仍然不会将 iat 设置为 int 类型,并且仍然会失败。我提出了一个小小的改变,可以解决 pr​​ 的问题

now_utc = datetime.datetime.now(tz=datetime.timezone.utc)  
iat = int(now_utc.timestamp())

我想得越多,我意识到日期时间对于这个示例没有用处。 datetime 模块提供了用于操作日期和时间的类,当您需要日期时,这些类非常有用。我们确实需要一个 utc 格式的整数,因此 time 模块更有用。

insetad,我们能做到

  now = int(time.time())

    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": now,
            "exp": now + 3600,
        }
    )

在此处查找此示例的完整(更新!)代码。

以上就是构建有效的 JWT 声明集的详细内容,更多请关注php中文网其它相关文章!