使用委托权限调用 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
我尝试使用图 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