繁体   English   中英

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

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

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

我已经使用User.ReadWrite.All Delegated 权限设置了一个应用程序注册,如文档授予的管理员权限中所述:

在此处输入图像描述

使用 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

然后我使用该令牌调用 function 来获取用户的属性:

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'}}}

如果我 go 回到我的 api 的权限并将User.ReadWrite.All委派权限更改为应用程序权限,它就可以工作。

根据我在这种情况下阅读的内容,我应该使用委托权限,但如何让它发挥作用?

如果您使用的是client credentials follow (使用客户端 ID 和客户端密码进行身份验证),因此您应该需要Application permissions来获取令牌并调用 function 来获取我的用户属性。 因此,不可能使用委托权限调用带有客户端 Crendetial 令牌的 API。

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

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

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

您可以参考此文档可以帮助调用 web API 的桌面应用程序:使用用户名和密码获取令牌

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM