繁体   English   中英

Google Cloud:在模拟服务帐户的同时签署 JWT

[英]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 标头。

IAM 服务账户凭证 API

方法:projects.serviceAccounts.signJwt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM