为何基于Microsoft OAuth2.0与Azure AD的登录脚本无法获取Access Token?
问题:Azure AD OAuth2.0登录脚本无法获取Access Token
我正在开发一款基于Microsoft OAuth2.0和Azure Active Directory(即Microsoft Entra ID)的登录脚本。目前认证流程可正常执行,已成功获取授权码(Authorization Code),但success.php端无法从OAuth2.0提供商处接收Access Token。尝试过调试、重写代码等多种方案,均未解决问题。另外,授权码可在success.php的请求路径中查看。出于安全考虑,所有敏感数据已做脱敏处理。
index.php
<?php //TODO: Azure Synchronisation session_start(); //* Überprüfen, ob der Benutzer authentifiziert ist if (isset($_SESSION['token'])) { header('Location: http://localhost/success.php'); //! Der Benutzer ist bereits authentifiziert exit(); } else { header('Location: https://login.microsoftonline.com/a502008d-5bd7-4ad1-b8e0-668da72219a8/oauth2/v2.0/authorize?client_id=XXXXXXXXX&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2Fsuccess.php&response_mode=query&scope=openid+email+offline_access+profile+User.Read&state=12345&code_challenge=XXXXXXXXXXXXXX&code_challenge_method=S256'); //! Der Benutzer ist bereits authentifiziert exit(); } //* Überprüfen, ob der Benutzer bereits mit einem Office-Dienst verbunden ist if (isset($_SERVER['AUTH_USER'])) { sleep(1); header('Location: http://localhost/success.php'); //! Der Benutzer ist bereits angemeldet exit(); } require_once($_SERVER['DOCUMENT_ROOT'].'/Assets/Configs/server.php'); //*Einbinden von server.php $windowsUser = isset($_SERVER['AUTH_USER']) ? $_SERVER['AUTH_USER'] : null; //*Variable für Authentifizierung require_once __DIR__.'/vendor/autoload.php'; //* Datei autoload.php einbinden use \League\OAuth2\Client\Provider\GenericProvider; //* Composer (PHP-Bibliothek) if($windowsUser) { $clientId = 'XXXXXXXXXXXXXXXXX'; //* Anwendungs-ID (Client) $clientSecret = 'XXXXXXXXXXXXXXXXX'; //* Geheime Clientschlüssel $tenantId = 'XXXXXXXXXXXXXXXXX'; //* Verzeichnis-ID (Mandant) //* Konfigurationsinformationen für OAuth2-Provider $provider = new GenericProvider([ 'clientId' => $clientId, 'clientSecret' => $clientSecret, 'redirectUri' => 'http://localhost/success.php', //* UmleitungsURI 'urlAuthorize' => "https://login.microsoftonline.com/XXXXXXXXXXXXXXXXX/oauth2/v2.0/authorize?client_id=XXXXXXXXXXXXXXXXX&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2Fsuccess.php&response_mode=query&scope=openid+email+offline_access+profile+User.Read&state=12345&code_challenge=XXXXXXXXXXXXXXXXX&code_challenge_method=S256", 'urlAccessToken' => "https://login.microsoftonline.com/XXXXXXXXXXXXXXXXX/oauth2/v2.0/token", 'urlResourceOwnerDetails' => '', 'scopes' => ['openid', 'email', 'offline_access', 'profile', 'User.Read'], //* Berechtigungen 'codeChallengeMethod' => 'S256', ]); if (isset($_GET['code'])) { $authorization_code = $_GET['code']; // Autorisierungscode aus GET-Parametern auslesen try { // Autorisierungscode verwenden, um Zugriffstoken zu erhalten $accessToken = $provider->getAccessToken('authorization_code', [ 'code' => $authorization_code, ]); // JSON-Antwort in ein assoziatives Array umwandeln $response = json_decode($accessToken->getBody(), true); // Zugriffstoken speichern $_SESSION['token'] = $accessToken->getToken(); $_SESSION['id_token'] = $accessToken->getValues()['id_token']; $accessTokenValue = $accessToken->getToken(); $_SESSION['accesstoken'] = $accessTokenValue; // Weiterleitung zur Erfolgsseite header('Location: http://localhost/success.php'); exit(); } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { echo "Fehler beim Abrufen des Zugriffstokens: " . $e->getMessage(); } } else { // Benutzer muss sich einloggen und wird dann zu Azure AD weitergeleitet $authUrl = $provider->getAuthorizationUrl(); // Autorisierungs-URL abrufen header('Location: ' . $authUrl); // Weiterleitung zur Autorisierungs-URL exit(); } } ?>
Success.php
<!DOCTYPE html> <html lang="DE"> <?php session_start(); $username = $_SESSION['user']; $Erfolg ='Sie haben sich erfolgreich angemeldet'; ?> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="Css.css"> <title> Erfolg </title> </head> <body> <header> <div id="Überschrift"> <h1>ITH Bolting Technology - Login</h1> <?php echo "Benutzer: "; echo($username); ?> </div> </header> <main> <h3> <?php echo($Erfolg); // Überprüfen, ob die Anzahl der Benutzer in der Session vorhanden ist if(isset($_GET['code'])) { $authorization_code = $_GET['code']; echo "Autorisierungscode: " . $authorization_code; } else { echo "Autorisierungscode nicht gefunden."; } if (isset($_SESSION['user_count'])) { echo "<p>Anzahl der Benutzer aus Azure AD: " . $_SESSION['user_count'] . "</p>"; } else { echo "<p>Es wurden keine Benutzer abgerufen.</p>"; } if(isset($_SESSION['accessToken'])) { echo "Access Token: " . $_SESSION['accesstoken']; } else { echo "Es wurde kein Accesstoken gefunden"; } ?> </h3> </main> </body> </html>
内容的提问来源于stack exchange,提问作者user21272320
相关产品推荐
相关产品推荐

