You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:45:54