我需要审查一个拉取请求,该请求正在修复样本报告的问题,并且在测试通过时,感觉样本中肯定还有更多事情需要更改。
我了解 JSON Web Token(JWT 发音为“jots”)有一段时间了,但我不了解它们。看到这个 PR 让我有理由进一步深入研究它们。
JWT 是一种用于在各方之间安全传输信息的开放标准方法。它们通常用于验证用户身份并授权对资源的访问。它们由 3 部分组成:标头、有效负载和签名。
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 }
此声明集包含以下字段:
通过将这些声明包含在 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中文网其他相关文章!