microsoftgraph / microsoftgraph/msgraph-sdk-python
Event loop is closed using RemovePasswordPostRequestBody
未关闭
还没有人认领这个 Issue。
priority:p2
type:bug
- 主要语言
- Python
- 星标
- 630
- 派生
- 96
- 平均合并
- 15 小时 20 分钟
- 30 天内合并 PR
- 3
描述
Describe the bug
I am trying to delete multiple app secrets in Azure. One key is deleted but it does not advance. I can add secrets just fine. I can delete ONE secret typically. But deleting multiple secrets ends with "Event loop is closed".
Expected behavior
I can add secrets just fine. I can delete ONE secret -- typically. But multiple fail as above.
How to reproduce
This code reproduces the problem:
from msgraph import GraphServiceClient
from azure.identity import ClientSecretCredential
from creds import tenant_id, client_id, client_secret
from msgraph.generated.applications.item.remove_password.remove_password_post_request_body import RemovePasswordPostRequestBody
credential = ClientSecretCredential(
tenant_id=tenant_id,
client_id=client_id,
client_secret=client_secret
)
from uuid import UUID
scopes = ['https://graph.microsoft.com/.default']
graph_client = GraphServiceClient(credential, scopes)
async def show_secrets():
result = await graph_client.applications.by_application_id(OBJECT_ID).get()
return result
async def delete_older_secrets():
try:
for one_secret in str_not_uuids:
print(f"== {one_secret}")
if one_secret == "__CURRENT__":
print("passing current")
continue
request_body = RemovePasswordPostRequestBody(key_id=UUID(one_secret),)
result = await graph_client.applications.by_application_id(
"OBJECT_ID"
).remove_password.post(request_body)
except Exception as e:
print(e)
else:
print('ok')
if __name__ == '__main__':
import asyncio
import operator
all_secrets=asyncio.run(show_secrets())
str_not_uuids=[str(x.key_id) for x in all_secrets.password_credentials]
asyncio.run(delete_older_secrets())
SDK Version
pip freeze | grep -iE "graph|azure"
azure-common==1.1.28
azure-core==1.32.0
azure-graphrbac==0.61.2
azure-identity==1.19.0
cryptography==44.0.0
microsoft-kiota-authentication-azure==1.7.1
msgraph-beta-sdk==1.17.0
msgraph-core==1.2.0
msgraph-sdk==1.17.0
msrestazure==0.6.4.post1
Latest version known to work for scenario above?
unknown
Known Workarounds
I can use msal in a non asyncio loop:
import msal
import requests
def remove_application_secrets(tenant_id, client_id, client_secret, secret_ids):
authority = f"[https://login.microsoftonline.com/{tenant_id}](https://login.microsoftonline.com/%7Btenant_id%7D)"
app = msal.ConfidentialClientApplication(
client_id,
authority=authority,
client_credential=client_secret
)
result = app.acquire_token_for_client(scopes=["[https://graph.microsoft.com/.default"]](https://graph.microsoft.com/.default%22]))
if "access_token" not in result:
print(result.get("error"))
print(result.get("error_description"))
return
# Remove each secret
headers = {
'Authorization': 'Bearer ' + result['access_token'],
'Content-Type': 'application/json'
}
for secret_id in secret_ids:
try:
url = f"[https://graph.microsoft.com/v1.0/applications/{object_id}/removePassword]
(https://graph.microsoft.com/v1.0/applications/%7Bobject_id%7D/removePassword)"
payload = {"keyId": secret_id}
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 204:
print(f"Successfully removed secret with ID: {secret_id}")
else:
print(f"Failed to remove secret {secret_id}. Status code: {response.status_code}")
print(response.text)
except Exception as e:
print(f"Error removing secret {secret_id}: {str(e)}")
remove_application_secrets(
client_id=client_id,
tenant_id=tenant_id,
client_secret=client_secret,
secret_ids=['blah1', 'blah2']
)
Debug output
Event loop is closed
Configuration
cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
Other information
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先运行报告中的 asyncio.run 流程,使用 GraphServiceClient、ClientSecretCredential 和 remove_password.post,然后检查客户端和凭据如何在重复调用期间管理其绑定到事件循环的资源。完成标准是删除多个应用程序机密时不会出现 "Event loop is closed",并且该行为由回归测试覆盖。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- azure, python
- 领域
- api, authentication
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100