microsoftgraph / microsoftgraph/msgraph-sdk-python

Event loop is closed using RemovePasswordPostRequestBody

Offen
#1,093 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

priority:p2 type:bug
Vorherrschende Sprache
Python
Sterne
630
Forks
96
Ø Merge
15 Std. 20 Min.
Gemergte PRs (30 T.)
3

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, den asyncio.run-Ablauf mit GraphServiceClient, ClientSecretCredential und remove_password.post aus dem Bericht auszuführen; untersuche anschließend, wie der Client und die Credential ihre an den Event Loop gebundenen Ressourcen über wiederholte Aufrufe hinweg verwalten. Die Aufgabe ist abgeschlossen, wenn das Löschen mehrerer Anwendungsgeheimnisse ohne "Event loop is closed" abgeschlossen wird und das Verhalten durch einen Regressionstest abgedeckt ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
azure, python
Bereich
api, authentication
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.