Вот последовательность действий. Сначала пользователь щелкает ссылку здесь:
ШАГ 1:
https://login.microsoftonline.com//oauth2. /v2.0/authorize?client_id=&scope=https://graph.microsoft.com/User.Read&r ... _type=code
ШАГ 2:
Код возвращается на мой сайт в виде запроса GET. Эта часть всегда работает.
https:///?code=longcodestring&session_state=sesisonstatestring
Когда мой сайт получает код, он использует этот PHP-запрос cURL:
ШАГ 3:
Код: Выделить всё
$curl = curl_init();
$params = array(
CURLOPT_URL =>
"https://login.microsoftonline.com/".AZURE_TENANT_ID."/oauth2/v2.0/token",
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS =>
"code=".$_GET['code']
."&grant_type=authorization_code"
."&scope=https://graph.microsoft.com/OpenID"
."&client_id=". AZURE_CLIENT_ID
."&client_secret=". AZURE_CLIENT_SECRET
."&redirect_uri=". "https://",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 4,
CURLOPT_TIMEOUT => 30,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
CURLOPT_NOBODY => false,
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
'Content-Type:application/x-www-form-urlencoded',
"Content-Length:1025",
),
);
curl_setopt_array($curl, $params);
$response = curl_exec($curl);
Эта очень специфическая проблема уже поднималась в прошлом. Запрос токена доступа OAuth к Azure AD ::: 400 — неверный запрос
Однако этот вопрос был задан 9 лет назад, и в этом случае решением было добавить параметр «ресурс». Этот параметр больше не поддерживается, хотя я считаю, что он был заменен на «область», которую я уже использую.
Для меня не имеет смысла, почему использование кода для получения токена доступа работает в первый раз, но не во второй, поскольку вызов cURL всегда происходит после того, как пользователь вошел в систему. Поэтому в коде должно быть что-то, что отличается, когда он не выдается при новом входе в систему. Однако в запросе GET на мой сайт нет ничего особенного.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ed-in-user