我的问题是找到一种方法可以成功使用微软的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>
如果 Azure Ad 应用程序配置为 SPA 并且您正在使用授权代码流进行身份验证,则通常会出现错误 “AADSTS9002325:跨域授权代码兑换需要代码交换的证明密钥”。
最初我遇到了同样的错误:
要解决该错误,将重定向 URL 配置为 WEB,如下所示:
更新设置后,我可以成功登录,如下所示: