我的用户帐户和我朋友的 API 都位于同一个 Azure 租户(假设租户 A)。
我的用户帐户有权从该 API 请求数据;我可以使用创建一个公共客户端应用程序并使用 AcquireTokenInteractive 来获取令牌;但我需要在浏览器中单击我的用户帐户才能获取令牌。
现在我想在我的个人租户上开发一个虚拟主机(我的用户帐户是该租户的管理员,假设租户 B)。
我最初的计划是,其他最终用户与租户 B 上的我的 Web 服务主机交互,然后我的 Web 服务使用我的用户帐户的令牌从租户 A 上朋友的 API 主机获取数据。
问题在于,一旦我在 Azure 上发布了我的项目,我就无法与浏览器进行交互并获取令牌。
我尝试寻找解决方法:
如有任何意见或建议,我们将不胜感激。
要在不同租户之间获取令牌,请确保创建多租户应用程序,其帐户类型如下:
在此应用程序中,我公开了一个 API 并添加了名为
Files.Read
的新自定义范围:
确保使用权限作为
/common
端点,并在获取令牌时选择来自不同租户的用户进行登录。
在我的例子中,我使用下面的示例 python 代码来使用交互式流程获取令牌:
import msal
client_id = 'appId'
authority = f"https://login.microsoftonline.com/common"
scope = ["api://appId/Files.Read"] # Modify scope if needed
app = msal.PublicClientApplication(client_id, authority=authority)
result = app.acquire_token_interactive(scopes=scope)
if "access_token" in result:
print("Access Token:", result['access_token'])
else:
print("Failed to acquire token:", result.get("error"), result.get("error_description"))
运行上述代码将要求用户使用
/common
端点选择一个帐户,您也可以从其他租户中选择任何帐户:
身份验证成功后,您将在response中获得访问令牌,如下所示:
您可以通过将访问令牌粘贴到 jwt.ms 网站来对其进行解码,并检查
iss
和 tid
声明以区分登录用户:
来自相同租户的登录用户的令牌:
来自不同租户的登录用户的令牌:
请注意,委托流程在获取代币时必须至少与用户交互一次,没有其他可能的方法。