PHP实现微软登录调用Microsoft Graph API返回UnknownError求助
问题描述
我用PHP开发「Microsoft登录」功能,已成功获取Access Token,但用该令牌调用Microsoft Graph API获取用户信息时返回UnknownError。已在后台配置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="en"> <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'; // 获取Access Token所需参数 $tokenRequestData = [ 'grant_type' => 'authorization_code', 'code' => $code, 'redirect_uri' => $redirectUri, 'client_id' => $clientId, 'client_secret' => $clientSecret, ]; // POST请求获取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']; // 请求用户信息 $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 '无法获取令牌'; } } else { echo '无法获取授权码'; } ?>
输出结果
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/H2NTcOzZiJOnPJKarZd4v9hIbra3e1q3gHhhVxNgr7bSY3tzOTTE23M3Li4T00YQMeMylR0vnBShFHXFX50CXv1KOTWp+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 ) ) )
内容的提问来源于stack exchange,提问作者I. Sen
相关产品推荐
相关产品推荐

