Onur Baskin
Onur Baskin

Reputation: 413

How to get Microsoft Graph API token to read mails

I'm trying to retrieve mails from my organization's mailbox, and I can do that via Graph Explorer. However, when I use the same information that I used in Graph Explorer, the generated token returns an error stating '/me request is only valid with delegated authentication flow.' in me/messages endpoint.

So, how can I generate the acceptable token for the /me endpoint?

An example python code or example Postman request would be amazing.

Upvotes: 0

Views: 641

Answers (1)

scottwtang
scottwtang

Reputation: 2040

It sounds like the endpoint you're using in Graph Explorer is something like this

https://graph.microsoft.com/v1.0/me/messages

/me is referring to the user signed into Graph Explorer. If you want to read another user's messages you would use

https://graph.microsoft.com/v1.0/users/[email protected]/messages

When connecting to Graph API as an application with no user interaction, you can never use /me endpoints, as there's no user logged in.

Reference

https://learn.microsoft.com/en-us/graph/api/user-list-messages?view=graph-rest-1.0

Python example to list messages

import requests

def get_messages(access_token, user):

    request_url = f"https://graph.microsoft.com/v1.0/users/{user}/messages"

    request_headers = {
        "Authorization": "Bearer " + access_token
    }

    result = requests.get(url = request_url, headers = request_headers)
    
    return(result)

msgs = get_messages(access_token = token['access_token'], user = "[email protected]")

print(msgs.content)

Additional example of obtaining a token, using an app registration and client secret

import msal

def get_token_with_client_secret(client_id, client_secret, tenant_id):
    # This function is to obtain a bearer token using the client credentials flow, with a client secret instead of a certificate
    # https://docs.microsoft.com/en-us/graph/sdks/choose-authentication-providers?tabs=CS#client-credentials-provider
    
    app = msal.ConfidentialClientApplication(
        client_id         = client_id,
        client_credential = client_secret,
        authority         = f"https://login.microsoftonline.com/{tenant_id}")

    scopes = ["https://graph.microsoft.com/.default"]

    token = app.acquire_token_for_client(scopes = scopes)

    return(token)

Upvotes: 1

Related Questions