在 Python 中将资源 ID 从 ADAL 转换为 MSAL

Converting Resource ID from ADAL to MSAL in Python

我们的系统需要访问 Azure 中的资源,因此在我们当前的身份验证代码中,我们支持 ADAL 可以很好地满足此目的。

现在 MSAL 正在取代 ADAL,我们想抢先添加对它的支持。我们现在正在创建一个使用 MSAL 而不是 ADAL.

生成 oauth2 access_token 的函数

我们已经跟进 migration guide,但有一个问题我们找不到答案。

使用 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 that is also available as a pypi package.

您可以使用 /.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" ]

参考:

The /.default scope

Scopes for a Web API accepting v1.0 tokens.