首页 > 解决方案 > 在 Python 中将资源 ID 从 ADAL 转换为 MSAL

问题描述

我们的系统需要访问 中的资源Azure,因此在我们当前的身份验证代码中,我们对此提供了ADAL很好的支持。

现在MSAL正在替换ADAL,我们想先发制人地添加对它的支持。我们现在正在创建一个生成oauth2 access_tokenusingMSAL而不是ADAL.

我们遵循了迁移指南,但有一个问题我们没有找到答案。

使用 时ADAL,我们将提供一个resource_id包含标识我们正在谈论的系统的 ID。通常这resource_id是从 Azure 门户复制的。

MSAL没有 的情况下resource_id,我们应该使用一个列表来scopes代替。如果我们天真地使用现有的resource_id作为这样的范围:

resource_id = "XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX"
scopes = [ resource_id ]

我们收到以下错误:

Error fetching MSAL token (invalid_scope):
    AADSTS70011: The provided request must include a 'scope' input parameter.
    The provided value for the input parameter 'scope' is not valid.
    The scope XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX is not valid.

E   Trace ID: XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX
E   Correlation ID: XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX
E   Timestamp: 2020-03-05 09:36:03Z

所以问题是,将 XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX 形式的资源 ID 准备为有效范围的正确方法是什么MSAL

编辑这个问题的答案已经过测试,并在一个小的 Python 包中使用,以简化使用名为requests_ms_auth的请求与 Azure 的身份验证,该请求也可作为pypi 包提供。

标签: pythonazuretokenadalmsal

解决方案


您可以使用/.default范围帮助将您的应用从 v1.0 端点 (adal) 迁移到 Microsoft 标识平台端点 (msal)。例如,范围值的https://graph.microsoft.com/.default功能与 v1.0 端点的功能相同resource=https://graph.microsoft.com

resource_id = "XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX"
scopes = [ f"{resource_id}/.default" ]

参考:

/.default 范围

接受 v1.0 令牌的 Web API 的范围。


推荐阅读