我正在使用azure-sdk从Azure Key Vault获取密钥。这将返回一个KeyBundle,它具有类型为azure.keyvault.v7_0.models.json_web_key_py3.JsonWebKey
的键属性
对于我的代码的不同部分,我需要从jwcrypto JWK制作一个签名的令牌。 JWT.make_signed_token
方法采用JsonWebKey。从Azure返回的JsonWebKey(我认为)实际上是在同一个类中,在不同的包中定义。
有没有办法让Azure JWK成为jwcrypto JWK?我假设可以逐个转置所有属性,但是想知道是否有更优雅的方式。
编辑:忘记包含版本......
将Azure JWK对象转换为jwcrypto
JWK对象的简单方法如下面的代码所示。
import jwcrypto.jwk as jwk
azureJwkObj = .... # your Azure JWK object
azureJwkDict = azureJwkObj.__dict__
jwcryptoJwkObject = jwk.JWK(**azureJwkDict)
下面也一样。
jwcryptoJwkObject = jwk.JWK().import_key(**azureJwkDict)
我认为import_key
的函数jwcrypto.jwk.JWK
需要一个dict
作为参数来生成一个jwcrypto
JWK对象后我查看了Azure KeyVault SDK和jwcrypto
for Python的源代码。
根据Azure KeyVault SDK的源代码json_web_key_py3.py
和jwk.py
的jwcrypto
,我尝试生成一个jwcrypto
JWK对象,通过下面的代码查看其结构。
from jwcrypto import jwk
key = jwk.JWK.generate(kty='oct', size=256)
print(key.__dict__)
# The output is {'_params': {'kty': 'oct'}, '_key': {'k': 'HJUk1CeudZ2Tur0fzHnOi-1U9UjxaUjClRW8TvqFakI'}, '_unknown': {}}
然后,我尝试使用下面的代码将Azure JWK对象转换为jwcrypto.jwk.JWK.import_key
所需的dictory,以通过jwcrypto
函数创建import_key
JWK对象。
import jwcrypto.jwk as jwk
azureJwkObj = .... # your Azure JWK object
azureJwkDict = azureJwkObj.__dict__
_params = {k: v for k, v in azureJwkDict.items() if k in jwk.JWKParamsRegistry.keys()}
kty = _params.get('kty', None)
_key = {k: v for k, v in azureJwkDict.items() if k in jwk.JWKValuesRegistry[kty].keys()}
args = {'_params': _params, '_key': _key, '_unknown': {}}
jwcryptoJwkObject = jwk.JWK.import_key(args)