【问题标题】:Generate jwcrypto JWK from azure python sdk JWK从 azure python sdk JWK 生成 jwcrypto JWK
【发布时间】:2019-07-18 16:54:30
【问题描述】:

我正在使用 azure-sdk 从 Azure Key Vault 获取密钥。这将返回一个 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

【问题讨论】:

    标签: python azure jwt azure-keyvault jwk


    【解决方案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.pyjwcryptojwk.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 的源代码似乎使用了点表示法,我真的不想弄乱它。
    猜你喜欢
    • 2019-10-21
    • 2019-08-30
    • 2021-04-07
    • 2022-10-06
    • 2016-08-14
    • 2019-05-24
    • 2020-11-19
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多