Python 在实例化MSAL机密客户端应用程序后,是否可以更改其权限?

Python 在实例化MSAL机密客户端应用程序后,是否可以更改其权限?,python,active-directory,azure-active-directory,microsoft-graph-api,msal,Python,Active Directory,Azure Active Directory,Microsoft Graph Api,Msal,我正在使用客户端凭据流开发一个多租户Azure AD应用程序,并依赖它获取调用MS Graph API所需的令牌。该应用程序本身是deamon和web应用程序的混合体,这意味着用户不能直接登录,但无论是在被调用时还是定期,它都需要代表用户进行MS Graph API调用。我已经正确注册了应用程序,管理员已经为所有租户授予了应用程序权限 根据所述请求令牌,对于具有相应权限的家庭租户,我成功地为该租户中的用户调用了Graph API。然而,当我试图为另一个租户中的用户调用MS Graph API时(

我正在使用客户端凭据流开发一个多租户Azure AD应用程序,并依赖它获取调用MS Graph API所需的令牌。该应用程序本身是deamon和web应用程序的混合体,这意味着用户不能直接登录,但无论是在被调用时还是定期,它都需要代表用户进行MS Graph API调用。我已经正确注册了应用程序,管理员已经为所有租户授予了应用程序权限

根据所述请求令牌,对于具有相应权限的家庭租户,我成功地为该租户中的用户调用了Graph API。然而,当我试图为另一个租户中的用户调用MS Graph API时(可能如预期的那样),它会导致错误的响应

我确信权限已被授予,因为如果我使用不同的权限重新实例化msal,或如所述手动调用
/token
端点,我将成功检索相应用户的Graph API数据

我没有发布任何代码,因为问题更多地涉及Python本身的设计和MSAL。此外,为了进行健全性检查,我尝试在实例化的msal应用程序中直接设置authority字段,但这并没有改变。在进一步挖掘MSAL源代码之后,我意识到它并没有改变,因为前者所依赖的NOTE、NOTE和NOTE的使用都会干扰权威本身。最后,我在存储库中找不到任何问题,在文档中找不到任何问题,也找不到任何能够回答我问题的问题

因此,由于我需要与之交互的租户可能会发生变化,而且我觉得每次我需要在自己的端点内请求访问令牌时实例化MSAL应用程序都会产生一些开销,因此我的问题是:

  • 我错过了什么明显的东西吗
  • 是否可以在创建msal实例后更改权限
  • 如果不可能,在这个用例中,处理每个租户访问令牌的获取的最佳方式是什么
  • 那就提前通知你

    编辑:
    我设法找到了一些可能有用的东西。它是由Azure提供的,在Azure中,每次都通过调用
    \u build\u msal\u app()
    方法来创建msal应用程序。尽管如此,我的问题仍然是这是否是最佳方式,即使答案可能与Azure的实现一致。

    您看到这个示例了吗?@AllenWu谢谢!是的,我看到了,但它不是完全相同的用例,因为程序只需要一次访问令牌。因此,当需要多个令牌时,它应该是什么样子还不清楚。我想退一步。当你说多租户应用程序时,是字面意思还是只是你有多个租户需要单独处理?在以后的情况下,您需要为每个租户创建不同的MSAL应用程序实例,并根据上下文中的目标租户使用相应的实例。您可以预先创建所有实例并将其保存在字典中。@krishg谢谢您的回复!我不太明白您提到的两个多租户定义之间的区别,但是是的,它在任何时候都可以处理多个租户。将它们保存在字典中可能是一个解决方案,但前提是在运行时管理字典,因为我不知道可能会注册的新租户。为这个想法干杯,也许你会同意!尽管如此,这仍然感觉像是一个有点黑客的方法。我提到的两个多租户场景之间的区别是第一个场景是目标租户拥有一个多租户应用程序(您可能需要阅读链接),而其他租户已经在其租户中授予了该应用程序的访问权限。所以,客户端总是使用“公共”或“组织”(是的,这些是特殊关键字)端点使用该应用程序进行身份验证,无论源租户是什么,都要访问目标租户的资源。而后者是,您只是分别使用租户特定的应用程序向不同租户进行身份验证。您看到此示例了吗?@AllenWu谢谢!是的,我看到了,但它不是完全相同的用例,因为程序只需要一次访问令牌。因此,当需要多个令牌时,它应该是什么样子还不清楚。我想退一步。当你说多租户应用程序时,是字面意思还是只是你有多个租户需要单独处理?在以后的情况下,您需要为每个租户创建不同的MSAL应用程序实例,并根据上下文中的目标租户使用相应的实例。您可以预先创建所有实例并将其保存在字典中。@krishg谢谢您的回复!我不太明白您提到的两个多租户定义之间的区别,但是是的,它在任何时候都可以处理多个租户。将它们保存在字典中可能是一个解决方案,但前提是在运行时管理字典,因为我不知道可能会注册的新租户。为这个想法干杯,也许你会同意!尽管如此,这仍然感觉像是一个有点黑客的方法。我提到的两个多租户场景之间的区别是第一个场景是目标租户拥有一个多租户应用程序(您可能需要阅读链接),而其他租户已经在其租户中授予了该应用程序的访问权限。所以,客户端总是使用“公共”或“组织”(是的,这些是特殊关键字)端点使用该应用程序进行身份验证,无论源租户是什么,都要访问目标租户的资源。而后者则是,您只需分别使用特定于租户的应用程序向不同租户进行身份验证。