使用委托权限调用 MS Graph 不起作用,而应用程序权限可以

Calling MS Graph with delegated privileges doesn't work while application privileges do

我尝试使用图 api 调用获取用户的自定义属性:

我已经使用User.ReadWrite.All委派权限设置了应用程序注册,如the documentation授予管理员权限:

使用 python,我可以使用我的应用程序注册密码获取令牌:

def retrieve_token(endpoint, client_id, client_secret):
    # endpoint = "https://login.microsoftonline.com/<tenant-id>/oauth2/token"
    payload = {
        "grant_type":"client_credentials",
        "client_id": client_id,
        "client_secret": client_secret,
        "resource":"https://graph.microsoft.com"
    }
    r = requests.request("POST", endpoint,data=payload).json()["access_token"]
    return r # returns a valid jwt token

然后我使用该令牌调用一个函数来获取用户的属性:

def get_user_role(endpoint,user_uid, token):
    # endpoint = "https://graph.microsoft.com/v1.0/users/"
    url = endpoint + user_uid 
    headers = {
        "Authorization": "Bearer " + token, 
        "Content-Type": "application/json"
    }
    return requests.request("GET", url, headers=headers).json()

出于某种原因,它缺少特权:

{'error': {'code': 'Authorization_RequestDenied', 'message': 'Insufficient privileges to complete the operation.', 'innerError': {'date': '2022-03-29T16:11:38', 'request-id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'client-request-id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'}}}

如果我返回 api 的权限并将 User.ReadWrite.All 委派权限 更改为 应用程序权限 有效。

根据我 在这种情况下我应该使用委派权限,但如何让它工作?

如果您正在使用 client credentials follow(使用客户端 ID 和客户端密码进行身份验证),那么您应该要求 Application permissions 获取令牌并调用一个函数来获取我的用户的属性。因此,无法使用委派权限通过客户端凭证令牌调用 API。

  • 正如 junnas 在评论中所述是正确的 当您想要调用 Web API 时,您通常使用委托权限登录用户。

  • 应用程序权限:您的应用程序需要直接访问网络 API(无用户上下文)。

因此您应该更改获取访问令牌的方式,例如以登录用户身份获取访问令牌的授权代码流或设备代码流

你可以参考这个 Document 可以帮助调用网络的桌面应用程序 APIs: Acquire a token using Username and Password