0

我正在使用azure-sdk从 Azure Key Vault 获取密钥。这将返回一个KeyBundle,它的key属性为azure.keyvault.v7_0.models.json_web_key_py3.JsonWebKey

对于我的代码的不同部分,我需要从jwcrypto JWK 制作签名令牌。该JWT.make_signed_token方法采用 JsonWebKey。从 Azure 返回的 JsonWebKey(我认为)实际上是同一个类,在不同的包中定义。

有没有办法将 Azure JWK 变成 jwcrypto JWK?我认为可以一个一个地转置所有属性,但想知道是否有更优雅的方式。

编辑:忘记包含版本...

  • 视窗 10
  • Python 3.6.5
  • jwcrypto 0.6.0
  • azure-keyvault 1.1.0 和 azure-mgmt-keyvault 1.1.0
4

1 回答 1

1

将 Azure JWK 对象转换为 JWK 对象的简单方法jwcrypto如下面的代码所示。

import jwcrypto.jwk as jwk

azureJwkObj = .... # your Azure JWK object
azureJwkDict = azureJwkObj.__dict__

jwcryptoJwkObject = jwk.JWK(**azureJwkDict)

下面也一样。

jwcryptoJwkObject = jwk.JWK().import_key(**azureJwkDict)

在我查看了 Azure KeyVault SDK 和Python的源代码后,我认为有一个 as 参数所需的函数import_key来生成JWK 对象。jwcrypto.jwk.JWKdictjwcryptojwcrypto

根据json_web_key_py3.pyAzure KeyVault SDK 和jwk.py的源代码jwcrypto,我尝试生成一个jwcryptoJWK 对象,通过下面的代码查看它的结构。

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创建JWK 对象所需的字典。jwcryptoimport_key

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)

于 2019-02-26T09:05:43.743 回答