Azure-获取用户刷新令牌失败

Azure-获取用户刷新令牌失败,azure,azure-active-directory,Azure,Azure Active Directory,我坐了一整天,也许我需要刷新我的眼睛,但我无法使用指南获得用户刷新令牌 我将解释我的情景: 我使用react创建了客户端页面,我调用/authorizeAPI来获取以下范围的代码:“email”、“openid”、“脱机访问”、“profile”。同意窗口正在打开,我同意这些条款。 (我可能不需要全部权限,但在我的会话中,我遇到了错误,决定转到大规模权限,只是为了让它工作) code被发送到我的服务器,在那里我调用了/tokenAPI,其作用域与我调用/authorize时在客户端中声明的作用域

我坐了一整天,也许我需要刷新我的眼睛,但我无法使用指南获得用户刷新令牌

我将解释我的情景:

  • 我使用react创建了客户端页面,我调用
    /authorize
    API来获取以下范围的
    代码:
    “email”、“openid”、“脱机访问”、“profile”
    。同意窗口正在打开,我同意这些条款。
    (我可能不需要全部权限,但在我的会话中,我遇到了错误,决定转到大规模权限,只是为了让它工作)
  • code
    被发送到我的服务器,在那里我调用了
    /token
    API,其作用域与我调用
    /authorize
    时在客户端中声明的作用域相同,并且具有相同的重定向URI
  • 基本URL是
    https://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()