我需要審查一個拉取請求,該請求正在修復樣本報告的問題,並且在測試通過時,感覺樣本中肯定還有更多事情需要更改。
我了解 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中文網其他相關文章!