microsoftgraph / microsoftgraph/msgraph-sdk-python

Event loop is closed using RemovePasswordPostRequestBody

未關閉
#1,093 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 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

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 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

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。