I am creating a “Log in with Microsoft” button using PHP. With the code below, I can obtain an Access Token, but when I make a cURL request to retrieve user information with the obtained Access Token, I get an unknownError. What’s the problem?
API permissions: Microsoft Graph (User.Read)
ms-login.php
<?php
$clientId = 'CLIENT_ID';
$redirectUri = 'REDIRECT_URI';
$authorizationUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
$params = [
'client_id' => $clientId,
'response_type' => 'code',
'redirect_uri' => $redirectUri,
'response_mode' => 'query',
'scope' => 'openid profile email',
];
$authUrl = $authorizationUrl . '?' . http_build_query($params);
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Log in with Microsoft</title>
</head>
<body>
<a href="<?php echo htmlspecialchars($authUrl); ?>">Log in with Microsoft</a>
</body>
</html>
ms-callback.php
<?php
if (isset($_GET['code'])) {
$code = $_GET['code'];
$tokenUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/token";
$clientId = 'CLIENT_ID';
$clientSecret = 'CLIENT_SECRET';
$redirectUri = 'REDIRECT_URI';
// Data required to obtain the access token
$tokenRequestData = [
'grant_type' => 'authorization_code',
'code' => $code,
'redirect_uri' => $redirectUri,
'cient_id' => $clientId,
'client_secret' => $clientSecret,
];
// POST request to get access token
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $tokenUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($tokenRequestData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
exit;
}
curl_close($ch);
$response = json_decode($response, true);
echo "<pre>";
print_r($response);
echo "</pre>";
if (isset($response['access_token'])) {
$accessToken = $response['access_token'];
// Request to obtain user information
$userInfoUrl = "https://graph.microsoft.com/v1.0/me";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $userInfoUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $accessToken,
'Content-Type: application/json',
]);
$userInfo = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
exit;
}
curl_close($ch);
$userInfo = json_decode($userInfo, true);
echo "<pre>";
print_r($userInfo);
echo "</pre>";
} else {
echo 'Could not get the token';
}
} else {
echo 'The authorization code could not be obtained.';
}
?>
Output:
Array
(
[token_type] => Bearer
[scope] => openid profile email
[expires_in] => 3600
[ext_expires_in] => 3600
[access_token] => EwB4A8l6BAAUbDba3x2OMJElkF7gJ4z/VbCPEz0AAQvCEolRPfUPCnWaqvAQ+KjzIcNnstha1m4tlbShSaqeCOrM7W/WQh0m7TL+jEKoHNnM9QtMoh4dWUa5aMWoP/pMqJZzPlIoAAB4P7zp4whnDWcZ/gyOfCrB57JTWBo4u1nNlSOlXjbEa7Aexe3sSPS/4y9BBJem+3AW/WnUs82MV6/H2NTcOzZiJOnPJKorZd4v9hIbra3e1q3gHhhVxNgr7bSY3tzOTTE23M3Li4T00YQMeMylR0vnBShFHXFX50CXv1KOTWp+twvv3eJiVAvJz4k15a4U6GO7KBYeSgU3YkrjrxxYjMlbCmpnb9iEzloeeUR6mHHgzSFSRVFFfFwQZgAAEF7x1mCN+WxysxoGXpS3oP1AAsENw6p+o5QyRKbHz0Js02R8ugwVjHZw8Zcxmd6lRuVNJgy3xIJVIfJuc+F0fxVta4yE22CTDr9haRmjPeyafsCG2s7Zp4FaOmpGTv+AGmpl9/yQyaG/ilYFKArWW7rjoJPquctOjF1aGyOFCXsGlhg2tSbk/zldOV7IuGGrspy1FLVdEuAVfISm3fJYGBWCaoWdou0a3njK5NlQjcKA7PbxQyU+fKTX1p7dQWd+ya3GyyZj3tpivXwyz+cY9kzsfKoI4TrfcuKzW/xhqTroFXbcC7qPW1D2cOdTtrfjt83bI9HR8OqLxaKrnPasFo0UuCkm4GZ4DtxFu+SKuLIQlgSMzdKzRBxIiFzY1NIrdhAanyMdRJxwHii3zpFMscOlrStwmMfYbJKW5KzoI+DrItsmaaFGFx5NyoP8iHTtZ54sJS5aFtMOlQGGjhsJzBYMt3GoV54/FFf0r+Wu//XoJz5G7CzYs3DFEZXfLe69yIQHNkai8SMBPFTBsLBFqmXV2/tgwuqWRnSvDcS69wlAxSLyozCx6YOCAbZBv+KQT39GOCCe0Hd/z+11PUBGQY/ltbm/m2IWs8f31CJjQ/7wz5AJE8If0jGouqbkY97big4EVZH7N+jDIkzfPbYBmHSSm3IWVuXISDohERI9DfewuSosYetXub1aF4xteL1nSdoN1PUrwTjVIom0BOXAIlYhuFAiZ5wNIt+0H+gZY7h5/rMwehgluZiX0Iu+FsR/YwCLB7/eFWri4DYqC2bT5oPM0nwC
[id_token] => eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6ImRHdEhRTWhHbHRKVUNjSF9TUVc2NG5FVW9ZRSJ9.eyJ2ZXIiOiIyLjAiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vOTE4ODA0MGQtNmM2Ny00YzViLWIxMTItMzZhMzA0YjY2ZGFkL3YyLjAiLCJzdWIiOiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFJWVVLZ29qRjlJSjJnNXIzRVBWSlhnIiwiYXVkIjoiMWVhZjM5N2QtM2M5ZC00MmUyLWIxYmItYzA0YjQwOThkY2I3IiwiZXhwIjoxNzIyNzEyNzA1LCJpYXQiOjE3MjI2MjYwMDUsIm5iZiI6MTcyMjYyNjAwNSwibmFtZSI6IsSwYnJhaGltIMWeZW4iLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJicmhtc244MEBvdXRsb29rLmNvbSIsIm9pZCI6IjAwMDAwMDAwLTAwMDAtMDAwMC1jYjdlLWRiZDZhOWQ0YzEyZSIsImVtYWlsIjoiYnJobXNuODBAb3V0bG9vay5jb20iLCJ0aWQiOiI5MTg4MDQwZC02YzY3LTRjNWItYjExMi0zNmEzMDRiNjZkYWQiLCJhaW8iOiJEc29KcWF0Z1RNQXU3dHdtekxsV3piZnk1ZnhyZlJjVmoxY0FYb2pIVEFQbzZubTEyZ2NBcmIzOThVa2ZxQTgyWXZ5UGFsMWZSKktia3hQSjhIS215SUJsd2swdGFzcHhTVEZ0YTA4aDRldEtFTjA0UEhBIXhsUk1ENEYwciEhKlcqWkFITW8xcCF2blJMRHNxTlMzTnllSWlvSURyeEM5NDBxKnlVa3RjelNYIn0.CgDSqoTlK4EXutgXWj4Qh9L1jra1nuQE1BUSK6Gwu_ljwVdIPci7U0e-y88_WhW1IAfoy_7Jb1n2P0L3tSmx2UXccyLak0sthVfyEBsUdunTiaBKUjIab2tYvUsr4gJKF0tsIKAh6y9fagbfKOuvVPKsUiwS9fcmxN_-A5QzxUNFkz0Bk75AVuLPwC3gESz04EZMETjaKATdkietAvNemP-sKwqOAmlgvUu5yR2HwgbH3eUh9QAoG8ELZAP2vw0IjEjG-FI9c7BIpmHyFqMmhzsb-LGEqpKJBNOLe95Vrap_CJtQPUCP45VTZ0zDvekVZ1iBvpjfEFa6_f-LX_uZCg
)
Array
(
[error] => Array
(
[code] => UnknownError
[message] =>
[innerError] => Array
(
[date] => 2024-08-02T19:18:26
[request-id] => 7cd0296a-e68c-4505-ad90-428ffd2ece22
[client-request-id] => 7cd0296a-e68c-4505-ad90-428ffd2ece22
)
)
)