Azure Python SDK获取Recovery服务Vault报错:'str'无'get_token'属性
解决Azure Recovery Services Vault列表脚本的AttributeError问题
问题场景
编写Python脚本尝试列出特定资源组下的所有Recovery Service Vaults,能成功获取并验证访问令牌,但遍历vaults时触发以下错误:
File "D:\pythonProject\lib\site-packages\azure\core\pipeline\policies\_authentication.py", line 93, in on_request self._token = self._credential.get_token(*self._scopes) AttributeError: 'str' object has no attribute 'get_token'
错误原因
RecoveryServicesClient的credential参数要求传入凭据对象(如ClientSecretCredential或AccessToken实例),而非直接传入令牌字符串。你错误地将access_token.token(字符串类型)传入,导致客户端尝试调用字符串的get_token方法,从而触发错误。
解决方案
方式一:直接使用ClientSecretCredential(推荐)
Azure SDK会自动处理令牌的获取与刷新,无需手动管理令牌。修改后的完整代码:
from azure.identity import ClientSecretCredential from azure.mgmt.recoveryservices import RecoveryServicesClient # 初始化服务主体凭据 tenant_id = "88888888-jhgf-7865-CCCC-XXXXXXXXXXXX" client_id = "99999999-lkjk-9877-ljhg-YYYYYYYYYYYY" client_secret = "gfhgfhgvbkjgftyrdthgjklkjlljfhfhgfhg" subscription_id = "yyyyyyyy-xxxx-kkkk-njjjj-ddddddddddd" # 创建ClientSecretCredential对象 creds = ClientSecretCredential( tenant_id=tenant_id, client_id=client_id, client_secret=client_secret ) # 初始化RecoveryServicesClient,直接传入凭据对象 recovery_service_client = RecoveryServicesClient( credential=creds, subscription_id=subscription_id ) # 列出指定资源组下的Recovery Services Vaults resource_group_name = "rg_myexample" vaults = recovery_service_client.vaults.list_by_resource_group(resource_group_name) # 遍历并打印Vault信息 for vault in vaults: print(f"Vault名称: {vault.name}") print(f"Vault ID: {vault.id}") print("---")
方式二:手动使用AccessToken实例(如需自定义令牌管理)
若必须手动处理令牌,需将AccessToken实例而非字符串传入credential参数:
from azure.core.credentials import AccessToken from azure.identity import ClientSecretCredential from azure.mgmt.recoveryservices import RecoveryServicesClient # 初始化服务主体凭据 tenant_id = "88888888-jhgf-7865-CCCC-XXXXXXXXXXXX" client_id = "99999999-lkjk-9877-ljhg-YYYYYYYYYYYY" client_secret = "gfhgfhgvbkjgftyrdthgjklkjlljfhfhgfhg" subscription_id = "yyyyyyyy-xxxx-kkkk-njjjj-ddddddddddd" resource_uri = "https://management.azure.com/" # 创建ClientSecretCredential对象 creds = ClientSecretCredential( tenant_id=tenant_id, client_id=client_id, client_secret=client_secret ) # 获取AccessToken实例 token = creds.get_token(resource_uri + "/.default") access_token = AccessToken(token.token, token.expires_on) # 初始化RecoveryServicesClient,传入AccessToken实例 recovery_service_client = RecoveryServicesClient( credential=access_token, subscription_id=subscription_id, base_url=resource_uri ) # 列出并打印Vault信息 resource_group_name = "rg_myexample" vaults = recovery_service_client.vaults.list_by_resource_group(resource_group_name) for vault in vaults: print(f"Vault名称: {vault.name}") print(f"Vault ID: {vault.id}") print("---")
关键修改点
- 方式一:移除手动获取令牌的代码,直接将
ClientSecretCredential实例传给RecoveryServicesClient,SDK自动处理令牌生命周期。 - 方式二:将
recovery_service_client初始化时的credential=access_token.token改为credential=access_token,传入AccessToken实例而非字符串。
内容的提问来源于stack exchange,提问作者amitsuneja
相关产品推荐
相关产品推荐

