Php 无法请求令牌

Php 无法请求令牌,php,microsoft-graph-api,guzzle,Php,Microsoft Graph Api,Guzzle,要使用Microsoft Graph,我尝试代表用户进行身份验证。我正在学习教程,目前我还停留在第3步 请求令牌时,我收到400错误请求响应: { "error": "invalid_scope", "error_description": "AADSTS70011: The provided request must include a 'scope' input parameter." } 尽管我包含了一个范围参数,但这是我的请求: $guzzle = new \GuzzleHtt

要使用Microsoft Graph,我尝试代表用户进行身份验证。我正在学习教程,目前我还停留在第3步

请求令牌时,我收到
400错误请求
响应:

{
  "error": "invalid_scope",
  "error_description": "AADSTS70011: The provided request must include a 'scope' input parameter."
}
尽管我包含了一个范围参数,但这是我的请求:

$guzzle = new \GuzzleHttp\Client(['headers' => [
    'Host' => 'https://login.microsoftonline.com',
    'Content-Type' => 'application/x-www-form-urlencoded'
    ]
]);

$url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
$token = json_decode($guzzle->post($url, [
    'form_params' => [
        'client_id' => '################################',
        'scope' => 'user.read%20mail.read',
        'code' => $_GET['code'],
        'grant_type' => 'authorization_code',
        'redirect_uri' => 'https://eb3ef49e.ngrok.io/callback.php',
        'client_secret' => '################'
    ],
])->getBody()->getContents());

我做错了什么?

我猜完整的错误描述是这样的:

AADSTS70011
:提供的请求必须包含“
范围”
”输入 参数为输入参数“scope”提供的值不正确 有效。作用域
user.read%20mail.read
无效。范围 格式无效。作用域必须采用有效的URI形式
或有效的Guid

如果是这样,Azure AD端点将无法识别此处提供的
范围
/token
端点希望将
范围
参数指定为以空格分隔的范围列表。这意味着此处无需显式转义空格符号:

'scope' => 'user.read%20mail.read'
而是按如下方式指定:

'scope' => 'user.read mail.read'

并将为
/token
端点构建编码正文的其余部分,该端点被标记为ms access和outlook。这个问题或代码与这两者有什么关系?请选择与直接问题有关的最小标记集,而不是整个项目的所有方面。