如何在Python中验证Azure访问令牌

问题描述 投票:0回答:1

这似乎是一个简单的过程,并且已经有很多库,但由于某种原因我无法使其工作。我对 Azure 很陌生,而且不是以英语为母语,因此我可能会使用一些错误的术语,请耐心等待。

我正在使用python3.10开发一个供内部使用的工具,我需要对用户进行身份验证。我们的 Azure 团队已为我注册了 Web 应用程序(单租户),并为我提供了租户 ID、客户端 ID 和客户端密钥。最终用户可以使用 Microsoft 提供的库 (ms-identity) 和示例代码 (ms-identity-python-webapp) 来获取访问代码(密码流)并将其发送到我的代码。让我们跳过为什么要这样做以及安全问题。我的问题是如何验证访问令牌?谷歌搜索使用 jwt 模块或名为 azure-ad-verify-token 的 python 模块返回一些解决方案,但它们都不适合我。我还看到了有关如何从“login.microsoftonline.com/{tenant id}/discovery/v2.0/keys”查找公钥并添加开始证书/结束证书以访问令牌但 jwt.decode 的分步说明函数总是返回“签名验证失败”。有人可以帮助我理解我做错了什么吗?

jwt.decode(
access_token,
public_key, # public key found in discovery/v2.0/keys "-----BEGIN CERTIFICATE-----\nMII...
algorithms='RS256',
audience=client_id,)
python azure access-token
1个回答
0
投票

如果您为 Microsoft Graph API 生成令牌,您将面临此问题:

In python:

enter image description here

出现此错误是正常行为。

In Jwt.io website:

即使在这里我们也得到无效签名:

enter image description here

当您为自定义 API 生成令牌时,可以解决这个问题,在我的例子中,我公开了一个 API 并添加了范围,并遵循 SO-Thread:

enter image description here

现在添加了如下权限:

enter image description here

然后授予权限:

enter image description here

现在使用来自 SO-Thread 的 python 代码。

然后当我运行代码时,我得到了预期的输出:

"grant_type": "password",
      "client_id": f"{client_id}",  
      "client_secret": f"{client_secret}",  
      "scope": "api://743-ac99-9e/custom_scope",
      "username":"m9.onmicrosoft.com",
      "password":"Welc3"

enter image description here

现在查看jwt.io网站:

enter image description here

Note:

无法验证 Graph API 访问令牌,因为它们不适用于应用程序。要检查访问令牌的任何权限,您可以使用 Expose API 方法来验证它。

© www.soinside.com 2019 - 2024. All rights reserved.