微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为 IAP 对从 GCP 服务帐户 json 生成的 JWT 进行签名会出现错误:“sign() 缺少 1 个必需的位置参数:”算法“

如何解决为 IAP 对从 GCP 服务帐户 json 生成的 JWT 进行签名会出现错误:“sign() 缺少 1 个必需的位置参数:”算法“

尝试使用 ES256 算法和以下代码从服务帐户密钥创建签名 JWT 以在 GCP 中使用:

import google.auth.jwt as jwt
import google.auth.crypt
import time
import json


sa_file = 'service_account.json'
iat = time.time()
exp = iat + 3600
sa_info = json.load(open('secret.json'))
aud = 'my-audience'
url = 'my-url'

payload = {'iss': sa_info['client_email'],'sub': sa_info['client_email'],'aud': aud,'iat': iat,'exp': exp
           }
additional_headers={'kid': sa_info['private_key_id'],'alg': 'ES256'}

signer = google.auth.crypt.ES256Signer.from_service_account_file(sa_file)
print(signer.key_id)
signed_jwt = jwt.encode(signer,payload,additional_headers,sa_info['private_key_id'])


print(signed_jwt)
print('------------')
print(sa_info['private_key'])
data = data = {
        'foo': 'bar'
    }
headers = {'Content-Type': 'application/json','Authorization': 'Bearer {}'.format(signed_jwt),'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer'
           }

#response = requests.post(url,headers=headers,data=data)

#print(response.status_code,response.content) 

但是我会得到这个错误

<ipython-input-15-06069c298e2a> in <module>
     22 signer = google.auth.crypt.ES256Signer.from_service_account_file(sa_file)
     23 print(signer.key_id)
---> 24 signed_jwt = jwt.encode(signer,sa_info['private_key_id'])
     25 
     26 

E:\Users\Kyle\anaconda3\lib\site-packages\google\auth\jwt.py in encode(signer,header,key_id)
    110 
    111     signing_input = b".".join(segments)
--> 112     signature = signer.sign(signing_input)
    113     segments.append(_helpers.unpadded_urlsafe_b64encode(signature))
    114 

E:\Users\Kyle\anaconda3\lib\site-packages\google\auth\crypt\es256.py in sign(self,message)
    118     def sign(self,message):
    119         message = _helpers.to_bytes(message)
--> 120         asn1_signature = self._key.sign(message,ec.ECDSA(hashes.SHA256()))
    121 
    122         # Convert ASN1 encoded signature to (r||s) raw signature.

TypeError: sign() missing 1 required positional argument: 'algorithm'

我也尝试过使用 PyJWT 并得到类似的错误。将算法更改为 RS256 时,它会起作用,但我仅限于使用 ES256 来签署 JWT。似乎没有地方可以传递另一个参数,但我可能忽略了一些东西。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。