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