从 azure python sdk JWK 生成 jwcrypto JWK
Posted
技术标签:
【中文标题】从 azure python sdk JWK 生成 jwcrypto JWK【英文标题】:Generate jwcrypto JWK from azure python sdk JWK 【发布时间】:2019-07-18 16:54:30 【问题描述】:我正在使用 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?我认为可以一个一个地转置所有属性,但想知道是否有更优雅的方式。
编辑:忘记包含版本...
Windows 10 Python 3.6.5 jwcrypto 0.6.0 azure-keyvault 1.1.0 和 azure-mgmt-keyvault 1.1.0【问题讨论】:
【参考方案1】:将 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 KeyVault SDK 的源代码和 Python 的 jwcrypto
的源代码后,我认为 jwcrypto.jwk.JWK
的函数 import_key
需要 dict
作为参数来生成 jwcrypto
JWK 对象.
根据Azure KeyVault SDK的源代码json_web_key_py3.py
和jwcrypto
的jwk.py
,我尝试生成一个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
所需的字典,以通过 import_key
函数创建 jwcrypto
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)
【讨论】:
感谢您的回答 :) 在我运行import_key
函数之前一切似乎都很好。我得到一个属性错误:File "AppData\Local\Programs\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\jwcrypto\jwk.py", line 365, in import_key kty = self._params.get('kty', None) AttributeError: 'dict' object has no attribute '_params'
@EllaP 我不熟悉 ArcGIS 中的 Python 3。您能否发布有关此 Python 的 ArcGIS 的更多信息,例如详细的 Python 版本?此外,您可以发布您的代码和其他有用的东西来帮助我解决这个问题。谢了。
它只是作为 ArcGIS 软件一部分的标准 python 3.6.5 发行版。我使用了像 azureJwkObj = azureKeyVaultClient.get_key(vault_url, key_name, key_version).key
这样的 azure 包,然后复制了您的代码。我得到 args 是字典的字典,它应该是什么类型?
@EllaP 根据我的经验,问题不是由代码引起的,而是由您的其他 Python 脚本或环境引起的。请检查您的Python环境,如import sys; print(sys.path)
,检查是否存在同名脚本文件导致与jwcrypto
自己通过pip install jwcrypto
安装的名称冲突问题,或者其他原因您可以在Google或Bing中搜索找到出来。
我尝试创建一些示例字典并使用点表示法访问键,但这似乎会产生 AttributeError。我已经查看了一些关于此的 SO 问题(例如 this one ),并将对其进行更多研究。 jwk 的源代码似乎使用了点表示法,我真的不想弄乱它。以上是关于从 azure python sdk JWK 生成 jwcrypto JWK的主要内容,如果未能解决你的问题,请参考以下文章
如何从用于 vm 的 Azure Python SDK 获取 OS 磁盘相关的详细信息
Python 中的 Web Crypto API JWK 用法