我目前正在使用以下代码来获取数据工厂的服务主体。此代码在本地运行良好,我能够检索 serviceprincipal。 这个问题是我获得身份的方式。我需要提供客户详细信息(这是在 AD 中创建的用于测试目的的演示应用注册。)
try:
app = msal.ConfidentialClientApplication(
self.input_client_id, authority=self.input_authority,
client_credential=self.input_secret,
)
result = app.acquire_token_for_client(scopes=self.input_scope)
input_endpoint = "https://graph.microsoft.com/v1.0/servicePrincipals?$filter=startswith(displayName,'{}')".format(datafactory_name)
graph_data = requests.get(
input_endpoint,
headers={'Authorization': 'Bearer ' + result['access_token']},).json()
我想避免这样做,因为我使用 devops 管道在容器注册表中运行此代码,并希望避免将机密作为变量提供。 管道使用服务连接,我使用 Azure CLI 任务登录。
有没有办法替换上面的代码来获取客户端凭据。
以下是一些已经在本地完成的试验:
使用azure devops服务连接在本地登录,模拟devops管道进行测试
az login --service-principal --username <clientid> --password <client_secret> --tenant <tenant_id>
from azure.common.credentials import get_azure_cli_credentials
credentials, subscription = get_azure_cli_credentials()
app = msal.ConfidentialClientApplication(
self.input_client_id, authority=self.input_authority,
client_credential=credentials,
)
这给出了一个错误:'error': 'invalid_client'
感谢您的时间!
答案 0 :(得分:1)
可能是由于client_secret 包含特殊字符。一种解决方法是转到 Azure 门户并不断生成新的机密,直到获得其中不含特殊字符的机密。有关详细信息,请参阅 here。
如果您想使用 Azure Identity for Python,您可以使用 AzureCliCredential
类获取访问令牌。
from azure.identity import AzureCliCredential
credential = AzureCliCredential()
access_token = credential.get_token(scopes=["..."])