Microsoft oAuth2 anmeldung nicht möglich?

Hi zusammen,

ich hab da mal ein Problem ;)

Ich möchte meinem team anbieten, sich anstelle der ID mit O365 anzumelden. Soweit sogut.

Leider gibt mir meine Seite diesen Fehler aus, sobald sich jemand anmeldet.

GuzzleHttp\Exception\RequestException Object
(
    [message:protected] => cURL error 3:  (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
    [string:Exception:private] => 
    [code:protected] => 0
    [file:protected] => /var/www/vhosts/HIERSTEHTMEINEDOMAIN/httpdocs/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
    [line:protected] => 211
    [trace:Exception:private] => Array
        (

Client ID & Secret sowie Redicret URL habe ich überall gecheckt. Es sollte weiterleiten auf /scripts/oauth_callback.php:

<?php
session_start();

require '../vendor/autoload.php';

$config = require '../config.php';

use League\OAuth2\Client\Provider\GenericProvider;

$tenantId = 'HIERMEINETENANTID'; // Ihre Tenant-ID

$provider = new GenericProvider([
    'clientId'                => $config['clientId'],
    'clientSecret'            => $config['clientSecret'],
    'redirectUri'             => $config['redirectUri'],
    'urlAuthorize'            => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize",
    'urlAccessToken'          => "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token",
    'urlResourceOwnerDetails' => '',
    'scopes'                  => 'openid profile email User.Read'
]);

if (!isset($_GET['code'])) {
    $authorizationUrl = $provider->getAuthorizationUrl();
    $_SESSION['oauth2state'] = $provider->getState();
    header('Location: ' . $authorizationUrl);
    exit;
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
    unset($_SESSION['oauth2state']);
    exit('Invalid state');
} else {
    try {
        // Debugging: Anfrageparameter ausgeben
        $tokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token";
        echo 'Token URL: ' . $tokenUrl . '<br>';
        echo 'Authorization Code: ' . $_GET['code'] . '<br>';

        $accessToken = $provider->getAccessToken('authorization_code', [
            'code' => $_GET['code']
        ]);

        $resourceOwner = $provider->getResourceOwner($accessToken);
        $userData = $resourceOwner->toArray();

        // Email-Adresse des Benutzers abrufen
        $userEmail = $userData['mail'] ?? $userData['userPrincipalName'];

        if ($userEmail) {
            // Benutzer anhand der E-Mail-Adresse in der Datenbank suchen
            global $pdo;
            $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
            $stmt->execute([$userEmail]);
            $user = $stmt->fetch();

            if ($user) {
                // Benutzer gefunden, in die Sitzung einloggen
                $_SESSION['user'] = $user;
                header('Location: /index.php');
                exit;
            } else {
                // Benutzer nicht gefunden, Fehler anzeigen oder Registrierung initiieren
                exit('Benutzer nicht gefunden.');
            }
        } else {
            exit('E-Mail-Adresse konnte nicht abgerufen werden.');
        }

    } catch (Exception $e) {
        // Debugging: Detaillierte Fehlerausgabe
        echo '<pre>';
        print_r($e);
        echo '</pre>';
        exit('Fehler beim Abrufen des Access Tokens.');
    }
}
?>

Weiß jemand von euch Rat? Ich (und ChatGPT ;)) sind mit unserem Latein am Ende..

LG Philip

Microsoft, MySQL, PHP

Meistgelesene Fragen zum Thema Microsoft