Azure-获取用户刷新令牌失败
我坐了一整天,也许我需要刷新我的眼睛,但我无法使用指南获得用户刷新令牌 我将解释我的情景:Azure-获取用户刷新令牌失败,azure,azure-active-directory,Azure,Azure Active Directory,我坐了一整天,也许我需要刷新我的眼睛,但我无法使用指南获得用户刷新令牌 我将解释我的情景: 我使用react创建了客户端页面,我调用/authorizeAPI来获取以下范围的代码:“email”、“openid”、“脱机访问”、“profile”。同意窗口正在打开,我同意这些条款。 (我可能不需要全部权限,但在我的会话中,我遇到了错误,决定转到大规模权限,只是为了让它工作) code被发送到我的服务器,在那里我调用了/tokenAPI,其作用域与我调用/authorize时在客户端中声明的作用域
/authorize
API来获取以下范围的代码:“email”、“openid”、“脱机访问”、“profile”
。同意窗口正在打开,我同意这些条款。
(我可能不需要全部权限,但在我的会话中,我遇到了错误,决定转到大规模权限,只是为了让它工作)
code
被发送到我的服务器,在那里我调用了/token
API,其作用域与我调用/authorize
时在客户端中声明的作用域相同,并且具有相同的重定向URIhttps://login.microsoftonline.com/common
用于上述通话
现在我收到错误的请求,原因如下:
{
"error": "invalid_grant",
"error_description": "AADSTS65001: The user or administrator has not consented to use the application
with ID <CLIENT_ID> named <APP_NAME>. Send an interactive authorization request for this user and resource.\r\nTrace ID: <ID1>\r\nCorrelation ID: <ID2>\r\nTimestamp: 2020-10-02 19:48:18Z",
"error_codes": [
65001
],
"timestamp": "2020-10-02 19:48:18Z",
"trace_id": <ID1>,
"correlation_id": <ID2>,
"suberror": "consent_required"
}
我有什么遗漏/做错了吗?希望得到任何帮助,因为这是我第四次删除应用注册并重新开始:)
谢谢尽管错误消息并不十分清楚,但您的问题是如何构建令牌请求主体 如果将数组作为POST请求数据中的值之一传递:
data={'foo':['a','b','c']}
请求。邮寄('https://example.com,data=data)
请求库,如下所示:
foo=a&foo=b&foo=c
因此,在您的代码中,您包括一个字符串数组作为令牌请求的范围
值:
“范围”:[“电子邮件”、“openid”、“脱机访问”、“配置文件”],
您正在导致结果请求的正文中包含多个单独的范围参数:
…&scope=email&scope=openid&scope=offline\u访问&scope=profile&。。。
相反,您需要的是单个范围参数,每个范围值用空格分隔:
“范围”:“openid电子邮件脱机访问配置文件”,
将其编码为:
…&scope=openid%20email%20offline\u访问%20profile&。。。
以下是构建令牌请求主体的更正代码:
数据={
“客户端id”:MICROSOFT客户端id,
“范围”:“电子邮件openid脱机访问配置文件”,
“代码”:代码,
“重定向uri”:”https://localhost:3000/msComplete',
“授权类型”:“授权代码”,
“客户端密码”:MICROSOFT客户端密码
}
您在/token呼叫中使用的URL是什么?忘了提到它,https://login.microsoftonline.com/common
。我也会将其添加到帖子中,谢谢。你可以分享你如何进行授权请求和令牌请求的代码吗?@PhilippeSignoret是的,添加到主帖子中,谢谢。我知道这很愚蠢。是的,很有效,谢谢
def get_refresh_token(code):
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'client_id': MICROSOFT_CLIENT_ID,
'scope': ["email", "openid", "offline_access", "profile"],
'code': code,
'redirect_uri': 'https://localhost:3000/msComplete',
'grant_type': 'authorization_code',
'client_secret': MICROSOFT_CLIENT_SECRET
}
response = requests.post('https://login.microsoftonline.com/common/oauth2/v2.0/token', headers=headers, data=data)
response.raise_for_status() # getting 400 with the mentioned error
return response.json()