用戶端應用程式發出的 API 要求若包含 JSON Web Token (JWT),可擴充服務 Proxy (ESP) 會先驗證 JWT 再將要求傳送至 API 後端。本頁說明若 JWT 驗證失敗,且 ESP 在回應用戶端時傳回錯誤,該如何疑難排解。如需關於 JWT 的詳細資訊,請參閱 RFC 7519。
錯誤:401: Jwt issuer is not configured
在 Cloud Run 中部署 ESPv2 時,如果 gcloud run deploy 指令未使用 --allow-unauthenticated 標記,就可能發生這種情況。如果未使用這個標記,Cloud Run <a=" docs="" managing-access"="" run="" securing="">存取控制 IAM 伺服器</a>會攔截並驗證 JWT 權杖,而不是 ESPv2。IAM 可能會使用與 ESPv2 不同的簽發者。</a=">
BAD_FORMAT
請確認下列事項:
- 確認 JWT 包含有效的 JSON。
- 檢查 JWT 標頭是否包含
"alg"欄位,且已設為下列其中一項:"RS256"、"HS256"、"RS384"、"HS384"、"RS512"或"HS512" - 檢查 JWT 酬載中以下欄位的資料類型 (若有出現這些欄位):
"iat"(簽發時間)、"exp"(到期時間) 和"nbf"(不早於) 聲明是數字,且大於 0,不是字串。"sub"(主體)、"iss"(發行者) 和"jti"(JWT ID) 欄位都是字串。"aud"(目標對象) 聲明可以是字串或字串陣列。- 確認 JWT 酬載中包含下列憑證附加資訊:
"sub"(主體)、"iss"(核發單位) 和"aud"(目標對象)。
以下範例說明有效的 JWT 解碼憑證:
{
"alg": "RS256",
"typ": "JWT",
"kid": "42ba1e234ac91ffca687a5b5b3d0ca2d7ce0fc0a"
}
Payload:
{
"iss": "myservice@myproject.iam.gserviceaccount.com",
"iat": 1493833746,
"aud": "myservice.appspot.com",
"exp": 1493837346,
"sub": "myservice@myproject.iam.gserviceaccount.com"
}
TIME_CONSTRAINT_FAILURE
使用 jwt.io 解碼 JWT,並且確認以下事項:
"exp"(到期時間) 憑證附加資訊確實存在。"exp"(到期時間) 憑證附加資訊值是未來的日期與時間。目前的日期與時間必須早於列在"exp"憑證附加資訊中的到期日期與時間。"nbf"(不早於) 憑證附加資訊 (如果有出現) 是過去的日期與時間。目前的日期與時間必須晚於或等於列在"nbf"憑證附加資訊中的日期與時間。
UNKNOWN
使用 jwt.io 解碼 JWT,並且確認以下事項:
- 如果
"iss"(簽發者) 聲明是電子郵件地址,則"sub"(主體) 和"iss"聲明應相同。這是為了確保電子郵件核發者自行核發 JWT。
錯誤:KEY_RETRIEVAL_ERROR
- 檢查
endpoints.Issuer物件的第二個參數指定的公開金鑰 URI 是否正確且有效。
錯誤:Issuer not allowed
- 檢查 JWT 憑證中的
"iss"(核發單位) 憑證附加資訊是否與endpoints.Issuer物件的第一個參數相符。
錯誤:Audience not allowed
如果 JWT 憑證中的 "aud" (目標對象) 憑證附加資訊與 Endpoints 服務名稱相符,Cloud Endpoints Frameworks 會驗證目標對象,並忽略 @endpoints.api 修飾符中 audiences 引數設定的值。舉例來說,如果您的服務名稱是 "myservice.appspot.com",則只要 JWT 的 "aud" 設為 "myservice.appspot.com" 或 "https://myservice.appspot.com",就是有效的目標對象。
如果 "aud" 憑證附加資訊與 Endpoints 服務名稱不同:
- 檢查 JWT 中的
"aud"憑證附加資訊是否與@endpoints.api修飾符中audiences引數的其中一個值相符。