Python 相当于 C# ADAL AuthenticationContext.AcquireToken

Python equivalent of C# ADAL AuthenticationContext.AcquireToken

我正在关注 tutorial 通过 AAD 对 Power BI REST API 进行身份验证 API。

本教程使用 C# 和 ADAL。它通过

获取令牌
AuthenticationContext authContext = new AuthenticationContext(authorityUri);
string token = authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri)).AccessToken;

我更愿意使用 Python,因此我正在尝试使用 ADAL library for Python

我可以通过

获取身份验证上下文
context = adal.AuthenticationContext(authority_url)

但我找不到与 AcquireToken 等效的 Python ADAL 函数。最近的选项似乎是 context.acquire_token 但这需要我提供一个 C# 版本不提供的 user_id arg(它也不接受重定向 URI arg)。

如何在 Python 中获得与教程的 C# 代码相同的行为?

我按照 ADAL lib GitHub page 中 "Acquire token with client creds" 部分中的示例进行了操作。

import adal
...
context = adal.AuthenticationContext("your_authority_uri")
token = context.acquire_token_with_client_credentials("your_resource_uri", _client_id, _client_secret)

几个样本here

这对你有用吗?

获取令牌功能的用法在 ADAL Python 中略有不同。在 ADAL Python 中,您必须知道要遵循哪个身份验证流程,然后使用适当的获取令牌调用。您可以在此 Azure AD article and usage of the different acquire token calls for python in these samples

中找到与应用程序类型和拓扑相关的不同身份验证流程

根据您上面提到的场景,您可以使用这个auth code flow示例。它需要客户端密码,但令牌是在用户以交互方式登录后授予的。

如果您仍然希望在不提供客户端密码的情况下进行交互流程,您可以参考device code flow示例。但是,设备代码流主要用于没有自己的交互式 Web 界面的纯文本设备。用户可以使用具有交互式 Web 界面的另一台设备进行登录。

(我的意思是将此作为对 中对话的评论,但它太长了,放不下)

感谢 Marcus 指出工作示例和该博客 post。然而,值得指出的是:

  • 作为应用进行身份验证与作为最终用户进行身份验证在概念上存在巨大差异。它们不可互换。似乎@JamesElderfield 想要以交互方式对最终用户进行身份验证,在这种情况下 acquire_token_with_client_credentials(...) 不是您正在寻找的机器人。
  • C# authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri)) 等价物大致相当于 ADAL acquire_token_with_authorization_code(...) Python,但是 确实目前还不是 ,尽管在本机应用程序(a.k.a.public 客户端)的 ADAL Python 中它是 already supported,但它需要应用程序开发人员实现自己的逻辑来启动 HTTP 服务器捕获重定向的授权码。
  • 如果上面的选项对您来说太复杂,您可以选择使用 Device Code flow, which is correctly suggested by