使用 Oauth2.0 和 Microsoft Entra ID 进行身份验证

问题描述 投票:0回答:1

我的问题是找到一种方法可以成功使用微软的OAuth2.0登录。

我有三个 php 文件。在 Index.php 中,您将自动移动到 auth.php,您必须在其中使用 Microsoft 登录。授权代码将发送到 success.php,您可以在其中获取访问令牌。这就是我所期望的。我使用 Entra ID,所以我用“XXXXXXXX”替换了一些内容。

还有一个本地登录,但这不是问题。重要的是使用 Microsoft OAuth2.0 和 Entra ID 进行身份验证。

索引.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: http://localhost/auth.php');  //! 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
 

if ($_SERVER["REQUEST_METHOD"] == "POST") 
    {
        $username = $_POST['uid'];
        $password = $_POST['pwd'];

        //* Datenbankverbindung aufbauen
        $connectionInfo = array("UID" => $uid, "PWD" => $pwd, "Database" => $databaseName, "CharacterSet" => $CharacterSet);
        $conn = sqlsrv_connect($serverName, $connectionInfo);

        if ($conn) 
        {
            $enteredUsername = $_POST['uid'];
            $enteredPassword = $_POST['pwd'];
            $hashedEnteredPassword = hash('sha256', $enteredPassword); //!Passwort wird gehashed

            $query = "SELECT * FROM Benutzer WHERE Benutzername=?";
            $params = array($enteredUsername);
            $options = array("Scrollable" => SQLSRV_CURSOR_STATIC);
            $stmt = sqlsrv_query($conn, $query, $params, $options);

            if ($stmt === false) 
            {
                die("<font color='red'><b>Abfragefehler:</b></font> " . print_r(sqlsrv_errors(), true));
            }

            $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

            if ($row) 
            {
                if ($hashedEnteredPassword == $row['HashedPasswort']) 
                {
                    
                    $_SESSION['user']=$row['Benutzername'];
                    $message = "<font color='green'><b>Sie wurden erfolgreich eingeloggt!</b></font>";
                    echo "Gehashtes Passwort aus der Datenbank: " . $row['HashedPasswort'];
                    header("Location: success.php");
                    exit();
                } 
                else 
                {
                    $message = "<font color='black'><b>Ihr Benutzername oder Passwort ist falsch. Versuchen Sie es erneut</b></font>";
                }
            } 
            else 
            {
                $message = "<font color='black'><b>Ihr Benutzername oder Passwort ist falsch. Versuchen Sie es erneut</b></font>";
            }

            sqlsrv_free_stmt($stmt);
            sqlsrv_close($conn);
        } 
        else 
        {
            die("<font color='red'><b>Verbindung fehlgeschlagen:</b></font> " . print_r(sqlsrv_errors(), true));
        }
    }
?>

<head>
    <title>ITH - Development Test</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="Css.css">
    <script src="Js.js"></script>
</head>

<body>
    <header>
        <div id="Überschrift">
            <h1>ITH Bolting Technology - Login</h1>
        </div>
        <h4>Diese Seite dient zum Einloggen - This page is for Logging in</h4>
        <h4>Bitte geben Sie ihre Login-Daten ein - Please enter your Login-data</h4>
        <?php
            if(isset($message))
            {   
                echo $message; 
            }
        ?>
    </header>
    <main>
        <div id="Anmeldung">
                <form method="post" action="index.php">
                    <label for="uid"><b>Benutzername - Username</b></label>
                    <input type="text" placeholder="Benutzername eingeben" name="uid" required>
                    
                    <label for="pwd"><b>Passwort - Password</b></label>
                    <input type="password" placeholder="Passwort eingeben" name="pwd" required>
                    <button type="submit" value="Login">
                        Einloggen - Login
                    </button>
                  
                </form>
       
        </div>
    </main>
</body>
</html>

auth.php

<?php
session_start();

// Überprüfen, ob der Benutzer bereits authentifiziert ist
if (isset($_SESSION['token'])) {
    header('Location: http://localhost/success.php');
    exit();
}

// Include der erforderlichen Bibliotheken
require_once __DIR__.'/vendor/autoload.php';

// Konfiguration für Azure AD OAuth2-Provider
$clientId = 'XXXXXXXXXXXXXXXXX';
$clientSecret = 'XXXXXXXXXXXXXXXXX';
$redirectUri = 'http://localhost/success.php'; // Ändern Sie dies entsprechend Ihrer Konfiguration
$tenantId = 'XXXXXXXXXXXXXXXXX';
$scope = 'https://graph.microsoft.com/User.Read https://graph.microsoft.com/profile https://graph.microsoft.com/email https://graph.microsoft.com/offline_access';



$provider = new \League\OAuth2\Client\Provider\GenericProvider([
    'clientId'                => $clientId,
    'clientSecret'            => $clientSecret,
    'redirectUri'             => $redirectUri,
    'urlAuthorize'            => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize",
    'urlAccessToken'          => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token",
    'urlResourceOwnerDetails' => '',
    'scopes'                  => $scope, // Ändern Sie die Bereiche entsprechend Ihren Anforderungen
    'enablePkce' => true
]);


$authorizationUrl = $provider->getAuthorizationUrl();

$_SESSION['oauth2state'] = $provider->getState();

header('Location: ' . $authorizationUrl);
exit();
?>

成功.php

<!DOCTYPE html>
<html lang="DE">

<?php
session_start();
$username = $_SESSION['user'];
$Erfolg ="Sie haben sich erfolgreich angemeldet";

// Extrahiere den Autorisierungscode aus der URL
$authorization_code = isset($_GET['code']) ? $_GET['code'] : null;
?>

    <head> 
        <meta charset="UTF-8">
        <link rel="stylesheet" href="Css2.css">
        <script src="Js.js"></script>
        <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

$Erfolg ="Sie haben sich erfolgreich angemeldet";

// Guzzle HTTP Client 
require_once __DIR__.'/vendor/autoload.php';
$clientId = 'XXXXXXXXXXXXXXXXX';
$clientSecret = 'XXXXXXXXXXXXXXXXX';
$redirectUri = 'http://localhost/success.php'; // Ändern Sie dies entsprechend Ihrer Konfiguration
$tenantId = 'XXXXXXXXXXXXXXXXX';
$scope = 'https://graph.microsoft.com/User.Read https://graph.microsoft.com/profile https://graph.microsoft.com/email https://graph.microsoft.com/offline_access';

$provider = new \League\OAuth2\Client\Provider\GenericProvider([
    'clientId'                => $clientId,
    'clientSecret'            => $clientSecret,
    'redirectUri'             => $redirectUri,
    'urlAuthorize'            => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize",
    'urlAccessToken'          => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token",
    'urlResourceOwnerDetails' => '',
    'scopes'                  => $scope // Ändern Sie die Bereiche entsprechend Ihren Anforderungen
]);

// Autorisierungscode aus der URL-Parameter erhalten
$authorizationCode = isset($_GET['code']) ? $_GET['code'] : null;

if (!$authorizationCode) {
    exit('Authorization code not provided.');
}

try {
    // Zugriffstoken anfordern
    $accessToken = $provider->getAccessToken('authorization_code', ['code' => $authorizationCode]);

    // Zugriffstoken erhalten
    $accessTokenValue = $accessToken->getToken();

    // Informationen über Benutzer abrufen
    $graph = new Microsoft\Graph\Graph();
    $graph->setAccessToken($accessTokenValue);
    $user = $graph->createRequest('GET', '/me')
                  ->setReturnType(Microsoft\Graph\Model\User::class)
                  ->execute();

    // Benutzerinformationen anzeigen
    echo 'Benutzername: ' . $user->getDisplayName();
    echo 'E-Mail: ' . $user->getMail();

} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
    exit('Failed to get access token: ' . $e->getMessage());
}

// Überprüfen, ob die Anzahl der Benutzer in der Session vorhanden ist
    /*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>";
    }*/

?>

            </h3> 
            <div id="authCode">
                <?php
                    if ($authorization_code) 
                    {
                        
                         // Autorisierungscode auf der Seite anzeigen
                         echo "<script>document.addEventListener('DOMContentLoaded', function() {
                            document.getElementById('authCode').textContent = 'Autorisierungscode: $authorization_code';
                        });</script>";
                    }
                ?>
            </div> 
        </main>
    </body>

</html>

php authentication oauth-2.0 azure-active-directory
1个回答
0
投票

如果 Azure Ad 应用程序配置为 SPA 并且您正在使用授权代码流进行身份验证,则通常会出现错误 “AADSTS9002325:跨域授权代码兑换需要代码交换的证明密钥”

最初我遇到了同样的错误

enter image description here

要解决该错误,将重定向 URL 配置为 WEB,如下所示:

enter image description here

更新设置后,我可以成功登录,如下所示:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.