[英]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.