我们正在尝试使用Python SDK(v2.0)和当前用户的CLI凭据创建Azure应用程序注册。
from azure.common.credentials import get_azure_cli_credentials
from azure.graphrbac import GraphRbacManagementClient
credentials, subscription_id = get_azure_cli_credentials()
client = GraphRbacManagementClient(credentials, 'my-tenant-id')
app_parameters = {
'available_to_other_tenants': False,
'display_name': 'my-app-name',
'identifier_uris': ['http://my-app-name.com']
}
app = client.applications.create(app_parameters)
但是这会返回
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/my-app-code/.venv/lib/python3.6/site-packages/azure/graphrbac/operations/applications_operations.py", line 86, in create
raise models.GraphErrorException(self._deserialize, response)
azure.graphrbac.models.graph_error.GraphErrorException: Access Token missing or malformed.
我们注意到,通过在构造函数中包含ServicePrincipalCredentials
来使用resource='https://graph.windows.net'
可以避免此错误,但在使用get_azure_cli_credentials()
时似乎没有相同的方法来执行此操作
我们做错了什么,或者这应该有用吗?
请不要回复我们应该使用ServicePrincipalCredentials
。我们的用例明确表示交互式用户可以使用Python SDK创建/注册Azure应用程序。
答案 0 :(得分:4)
get_azure_cli_credentials
实际上还没有为您提供一个凭据“资源”定义与ARM不同的凭证类(现在为:azure-common 1.1.10及以下)
您可以通过以下方式解决:
from azure.common.credentials import get_cli_profile
profile = get_cli_profile()
cred, subscription_id, _ = profile.get_login_credentials(resource='https://graph.windows.net')
请在https://github.com/Azure/azure-sdk-for-python上创建一个问题,并附上此SO的链接,我会尝试为下一版azure-common执行此操作。
(我在MS工作并拥有此代码)
编辑:发布了1.1.11的部分内容 https://pypi.org/project/azure-common/1.1.11/
from azure.common.credentials import get_azure_cli_credentials
cred, subscription_id = get_azure_cli_credentials(resource='https://graph.windows.net')
答案 1 :(得分:0)
您可以立即获取凭据和tenant_id并创建一个客户端行,如下所示:
from azure.common.credentials import get_azure_cli_credentials
from azure.graphrbac import GraphRbacManagementClient
cred, _, tenant_id = get_azure_cli_credentials(
resource='https://graph.windows.net',
with_tenant=True)
client = GraphRbacManagementClient(cred, tenant_id)
这就像一个护身符。
请注意,此API已弃用。支持新的Microsoft Graph(通过Azure AD Graph)。