如何通过REST API或Python SDK用Azure服务主体创建删除另一服务主体密钥
服务主体密钥创建/删除Python实现方案
前置准备
首先需要给作为操作凭证的第一个服务主体配置足够的操作权限:
- 进入Azure Portal的Azure Active Directory管理页面,找到第一个服务主体对应的应用注册条目
- 进入「API权限」标签页,添加Microsoft Graph的应用权限
Application.ReadWrite.All - 点击「授予管理员同意」完成权限生效,未完成同意的权限无法正常调用接口
然后安装所需依赖包:
pip install azure-identity requests
核心实现代码
注意:操作第二个服务主体时需要用到它的对象ID,可在其应用注册概述页获取,不是客户端/应用ID
from azure.identity import ClientSecretCredential import requests from datetime import datetime, timedelta # 基础配置参数 TENANT_ID = "第一个服务主体所属的租户ID" # 第一个服务主体(凭证用)的信息 FIRST_SP_CLIENT_ID = "第一个服务主体的客户端ID" FIRST_SP_CLIENT_SECRET = "第一个服务主体的客户端密钥" # 第二个服务主体(要操作的目标)的信息 SECOND_SP_OBJECT_ID = "第二个服务主体的对象ID" # 初始化凭证,获取Graph API访问token credential = ClientSecretCredential( tenant_id=TENANT_ID, client_id=FIRST_SP_CLIENT_ID, client_secret=FIRST_SP_CLIENT_SECRET, scope=["https://graph.microsoft.com/.default"] ) access_token = credential.get_token("https://graph.microsoft.com/.default").token headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } def create_second_sp_secret(expire_days=730): """ 为第二个服务主体创建新的客户端密钥 :param expire_days: 密钥有效期,默认2年(730天) :return: 生成的密钥信息,包含明文密钥值(仅返回一次) """ create_url = f"https://graph.microsoft.com/v1.0/applications/{SECOND_SP_OBJECT_ID}/addPassword" payload = { "passwordCredential": { "displayName": "自动创建的服务主体密钥", # 可自定义密钥名称 "endDateTime": f"{(datetime.utcnow() + timedelta(days=expire_days)).isoformat()}Z" } } resp = requests.post(create_url, headers=headers, json=payload) resp.raise_for_status() return resp.json() def delete_second_sp_secret(secret_key_id): """ 删除第二个服务主体下指定的客户端密钥 :param secret_key_id: 要删除的密钥的keyId,可通过查询服务主体信息获取 """ delete_url = f"https://graph.microsoft.com/v1.0/applications/{SECOND_SP_OBJECT_ID}/removePassword" payload = { "keyId": secret_key_id } resp = requests.post(delete_url, headers=headers, json=payload) resp.raise_for_status() return "删除成功" # 示例调用 if __name__ == "__main__": # 创建密钥 new_secret = create_second_sp_secret() print("新生成的密钥值(仅显示一次,请及时保存):", new_secret["secretText"]) print("新密钥的keyId:", new_secret["keyId"]) # 删除密钥(示例,传入要删除的keyId即可) # delete_result = delete_second_sp_secret("要删除的密钥的keyId") # print(delete_result)
注意事项
- 新创建的密钥明文仅会在创建接口返回时展示一次,后续无法再通过接口查询,请创建后立即保存
- 如果需要查询目标服务主体下已有的所有密钥信息,调用GET接口
https://graph.microsoft.com/v1.0/applications/{SECOND_SP_OBJECT_ID},返回结果的passwordCredentials字段即为所有密钥的信息(不含明文) - 密钥有效期最长建议设置为2年,不推荐设置无过期时间的密钥
- 若接口返回403错误,优先检查第一个服务主体的
Application.ReadWrite.All权限是否已经授予管理员同意
内容的提问来源于stack exchange,提问作者Diggy
相关产品推荐
相关产品推荐

