从天蓝色的Python SDK JWK生成jwcrypto JWK

时间:2019-02-25 10:00:02

标签: python azure jwt azure-keyvault jwk

我正在使用azure-sdk从Azure密钥保管库中获取密钥。这将返回一个 KeyBundle ,它具有类型为azure.keyvault.v7_0.models.json_web_key_py3.JsonWebKey

key 属性。

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

是否有一种方法可以将Azure JWK变成jwcrypto JWK?我认为可以将所有属性一一转换,但是我想知道是否还有一种更优雅的方法。

编辑:忘记添加版本...

  • Windows 10
  • Python 3.6.5
  • jwcrypto 0.6.0
  • azure-keyvault 1.1.0和azure-mgmt-keyvault 1.1.0

1 个答案:

答案 0 :(得分:0)

将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)

在我查看Azure的源代码后,我认为有一个import_key的函数jwcrypto.jwk.JWK需要一个dict作为参数来生成一个jwcrypto JWK对象适用于Python的KeyVault SDK和jwcrypto

根据Azure KeyVault SDK的源代码json_web_key_py3.pyjwcrypto的{​​{3}},我尝试生成一个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所需的字典,以通过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)