[英]Sign Google Cloud Storage URLs with Google Compute Engine default service account
[英]Google Cloud: sign a JWT while impersonating a service account
目标:
我有一个云功能,可以根据提供给它的服务帐户电子邮件来模拟服务帐户。 然后我想使用模拟的服务帐户来签署 jwt。
我试过的:
我已经像这样设置了服务帐户的模拟:
credentials = google.auth.impersonated_credentials.Credentials(
source_credentials=SOURCE_CREDENTIALS,
target_principal=SA_EMAIL,
target_scopes=TARGET_SCOPES,
lifetime=300)
这给我带来了一个子问题:我需要指定哪些目标范围?
创建模拟凭据后,我尝试使用signer
( docs ) 对 JWT 的负载进行签名:
payload = {
'iat': now,
"exp": now + expiry_length,
[...]
}
signer = target_credentials.signer
jwt = google.auth.jwt.encode(signer, payload)
我收到的错误消息是:
AttributeError: 'Credentials' object has no attribute 'key_id'
题:
我怀疑我使用signer
方法没有走上正确的轨道。
怎样才能实现我的目标?
在您的示例代码中,您只创建了有效负载部分。 签名的 JWT 还需要一个标头。
标题如下所示:
header = {
'kid': pkey_id, # Signing Private Key ID
"alg": "RS256", # Google uses SHA256withRSA
"typ": "JWT"
}
标头和有效负载经过 base64 编码,然后在其间使用点(句点符号)连接。 您对组合数据进行签名。
您将遇到的问题是您需要私钥 id(在我的示例中为 pkey_id)。 该值位于服务帐号 JSON 密钥文件中。 但是,Google 不会发布用于签名的 JSON 密钥文件。 使用的密钥是 Google 私有的。 您可以通过首先签署一些数据来获取私钥,因为 pkey_id 作为响应的一部分返回。 然后签署您的 JWT。
我建议您从使用 Sign Blob API 切换到使用 SignJwt API。 SignJwt API 不要求您创建 JWT 标头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.