Problem: Benutzer wird nach erfolgreichem Steam-Login nicht als eingeloggt erkannt

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem: Benutzer wird nach erfolgreichem Steam-Login nicht als eingeloggt erkannt

    Ich habe auf meiner Seite (PHPFusion 9.20) eine eigene Steam-Login-Integration gebaut.
    Der Loginprozess funktioniert technisch gesehen vollständig:
    • Die Steam-ID wird korrekt ausgelesen und ein Benutzer wird bei Bedarf automatisch angelegt.
    • Die Session-Werte fusionuc223_user_id, fusionuc223_user_pass und fusionuc223_lastvisit werden korrekt gesetzt.
    • Auch das Login-Cookie fusionuc223_user wird gesetzt, mit passender Domain, Secure-Flag, HttpOnly und SameSite=Lax.
    • In der Datenbank wird das Session-Feld (user_session) gesetzt.

    Trotzdem erkennt PHPFusion den User nicht als eingeloggt – weder auf der Startseite noch im Userpanel.


    Datei: init-openId.php
    PHP Code:
    <?php

    $login_url_params 
    = [
    'openid.ns' => 'http://specs.openid.net/auth/2.0',
    'openid.mode' => 'checkid_setup',
    'openid.return_to' => 'https://roadrunner-transporte.com/infusions/steam_login/process-openId.php',
    'openid.realm' => (!empty($_SERVER['HTTPS']) ? 'https' 'http').'://'.$_SERVER['HTTP_HOST'],
    'openid.identity' => 'http://specs.openid.net/auth/2.0/identifier_select',
    'openid.claimed_id' => 'http://specs.openid.net/auth/2.0/identifier_select',
    ];

    $steam_login_url 'https://steamcommunity.com/openid/login'.'?'.http_build_query($login_url_params'''&');

    // Umleitung zum Steam-Login
    header("Location: $steam_login_url");
    exit();
    Datei: process-openId.php
    PHP Code:
    <?php
    require_once __DIR__.'/../../maincore.php';

    use 
    PHPFusion\Authenticate;
    use 
    PHPFusion\PasswordAuth;

    // Steam API Key
    $steam_api_key 'Hier steht mein API Key';

    function 
    generate_unique_username($base) {
        
    $base preg_replace("/[^a-zA-Z0-9]/"""strtolower($base));
        
    $base substr($base020);
        
    $username $base;
        
    $i 1;
        while (
    dbcount("(user_id)"DB_USERS"user_name = '".$username."'")) {
            
    $username $base.$i;
            
    $i++;
        }
        return 
    $username;
    }

    // Prüfen ob Steam-ID zurückkommt
    if (!isset($_GET['openid_claimed_id'])) {
        die(
    "Steam Login fehlgeschlagen.");
    }

    // SteamID extrahieren
    preg_match("#^https://steamcommunity.com/openid/id/([0-9]{17,25})#"$_GET['openid_claimed_id'], $matches);
    $steam_id $matches[1] ?? null;
    if (!
    $steam_id) {
        die(
    "Ungültige Steam-ID.");
    }

    // Steam-Daten abrufen
    $api_url "https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$steam_api_key}&steamids={$steam_id}";
    $response file_get_contents($api_url);
    $data json_decode($responsetrue);
    if (!isset(
    $data['response']['players'][0])) {
        die(
    "Steam-Nutzer nicht gefunden.");
    }

    $player $data['response']['players'][0];
    $avatar $player['avatarfull'] ?? '';
    $name $player['personaname'] ?? 'steamuser';

    // Prüfen ob Nutzer mit dieser SteamID existiert
    $result dbquery("SELECT * FROM ".DB_USERS." WHERE user_steam = :steam", [':steam' => $steam_id]);

    if (
    dbrows($result)) {
        
    $user dbarray($result);
    } else {
        
    // Benutzer anlegen
        
    $username generate_unique_username($name);
        
    $salt hash("sha256"uniqid());
        
    $raw_pass uniqid(); // Dummy-Passwort
        
    $pass hash_hmac("sha256"$raw_pass$salt);
        
    $email "{$steam_id}@steam.roadrunner";

        
    dbquery("INSERT INTO ".DB_USERS."
            (user_name, user_email, user_password, user_salt, user_algo, user_joined, user_level, user_status, user_language, user_avatar, user_steam)
            VALUES
            (:uname, :email, :pass, :salt, 'sha256', :joined, 101, 0, 'German', :avatar, :steam)"
    , [
            
    ':uname'  => $username,
            
    ':email'  => $email,
            
    ':pass'   => $pass,
            
    ':salt'   => $salt,
            
    ':joined' => time(),
            
    ':avatar' => $avatar,
            
    ':steam'  => $steam_id
        
    ]);

        
    $result dbquery("SELECT * FROM ".DB_USERS." WHERE user_steam = :steam", [':steam' => $steam_id]);
        
    $user dbarray($result);
    }

    // Session korrekt setzen
    $_SESSION[COOKIE_PREFIX.'user_id']     = $user['user_id'];
    $_SESSION[COOKIE_PREFIX.'user_pass']   = $user['user_password'];
    $_SESSION[COOKIE_PREFIX.'lastvisit']   = time();

    // COOKIE korrekt setzen
    $isSecure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
    Authenticate::setUserCookie($user['user_id'], $user['user_salt'], $user['user_algo'], truetrue$isSecure);

    // Session-Token schreiben (Fusion erwartet das)
    $passAuth = new PasswordAuth();
    $passAuth->currentAlgo $user['user_algo'];
    $passAuth->currentSalt $user['user_salt'];
    $passAuth->currentPasswordHash $user['user_password'];
    $passAuth->inputPassword ''// kein echtes Passwort vorhanden

    // Methode ist jetzt public!
    Authenticate::storeUserSession($passAuth$user['user_id']);

    // DEBUG: Cookie-Zustand speichern
    file_put_contents(__DIR__.'/cookie_debug.txt'print_r([
        
    'COOKIE_DOMAIN' => defined('COOKIE_DOMAIN') ? COOKIE_DOMAIN 'not defined',
        
    'COOKIE_PATH'   => defined('COOKIE_PATH') ? COOKIE_PATH 'not defined',
        
    'COOKIE_NAME'   => defined('COOKIE_USER') ? COOKIE_USER 'not defined',
        
    'CookiesSent'   => headers_sent() ? 'yes' 'no',
        
    'SESSION'       => $_SESSION,
        
    'UserID'        => $user['user_id'],
        
    'UserAlgo'      => $user['user_algo'],
        
    'UserSalt'      => $user['user_salt'],
    ], 
    true));

    file_put_contents(__DIR__.'/cookie_check.log'json_encode($_COOKIEJSON_PRETTY_PRINT));
    file_put_contents(__DIR__.'/headers_check.txt'implode("\n"headers_list()));

    // Weiterleitung zur Startseite
    redirect(BASEDIR.'index.php');
    exit;



    Datei: Authenticate.php

    Codeabschnitt 1:
    PHP Code:
        /**
         * @param int    $userID
         * @param string $salt
         * @param string $algo
         * @param bool   $remember
         * @param bool   $userCookie
         */
        
    public static function setUserCookie($userID$salt$algo$remember false$userCookie true) {
            
    $cookieName $userCookie COOKIE_USER COOKIE_ADMIN;
            
    $cookiePath COOKIE_PATH ?: '/';
            
    $cookieDomain COOKIE_DOMAIN ?: $_SERVER['HTTP_HOST'];
            
    $secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
            
    $expiry $remember time() + 1209600 time() + 172800;

            
    $key  hash_hmac($algo$userID.$expiry$salt);
            
    $hash hash_hmac($algo$userID.$expiry$key);
            
    $cookieContent $userID.".".$expiry.".".$hash;

            if (!
    headers_sent()) {
                
    // PHP 7.3+ Syntax
                
    if (PHP_VERSION_ID >= 70300) {
                    
    setcookie($cookieName$cookieContent, [
                        
    'expires'  => $expiry,
                        
    'path'     => $cookiePath,
                        
    'domain'   => $cookieDomain,
                        
    'secure'   => $secure,
                        
    'httponly' => true,
                        
    'samesite' => 'Lax'
                    
    ]);
                } else {
                    
    $params "Path={$cookiePath}; Domain={$cookieDomain}; ".($secure "Secure; " "")."HttpOnly; SameSite=Lax";
                    
    header("Set-Cookie: {$cookieName}={$cookieContent}; Expires=".gmdate("D, d-M-Y H:i:s T"$expiry)."; {$params}");
                }
            } else {
                
    // Debug wenn zu spät
                
    file_put_contents(__DIR__.'/cookie_fail.log''Headers already sent when trying to set cookie'FILE_APPEND);
            }
        }
    ​ 
    Codeabschnitt 2:
    PHP Code:
        /**
         * Get the redirection url
         * If there is a new authentication url, error request will not valid
         *
         * @param int    $errorId
         * @param string $userStatus
         * @param string $userId
         *
         * @return string
         * @todo: use addNotice('') instead of going for errorId
         *
         */
        
    public static function getRedirectUrl($errorId$userStatus ""$userId "") {
            global 
    $_SERVER;

            if (
    self::$authenticate_url) {
                return 
    self::$authenticate_url;
            }

            
    $return BASEDIR."login.php?error=".$errorId;

            if (
    $userStatus) {
                
    $return .= "&status=".$userStatus;
            }
            if (
    $userId) {
                
    $return .= "&id=".$userId;
            }
            
    $return .= "&redirect=".urlencode($_SERVER['PHP_SELF']);
            if (
    FUSION_QUERY) {
                
    $return .= urlencode("?".preg_replace("/&amp;/i""&"FUSION_QUERY));
            }

            return 
    $return;
        }

        
    /**
         * @param PasswordAuth $passAuth
         * @param int          $user_id
         */
        
    public static function storeUserSession(PasswordAuth $passAuth$user_id) {
            if (
    $passAuth->isValidCurrentPassword(TRUE)) {
                
    $session $passAuth->getNewSalt().".".$passAuth->getNewHash();
                
    dbquery("UPDATE ".DB_USERS." SET user_session='$session' WHERE user_id=$user_id");
            }
        }
    ​ 

    Datei: maincore.php
    PHP Code:
    /**
    * Login / Logout / Revalidate
    */
    $userdata = [];
    if (
    check_post('login') && check_post('user_name') && check_post('user_pass')) {
    if (
    fusion_safe()) {
    $auth = new Authenticate(post('user_name'), post('user_pass'), check_post('remember_me'));
    if (
    $auth->authRedirection()) {
    // auth mode for security pin
    // on second refresh, the validateAuthUser will kick in and log user out if session not loaded.
    redirect(BASEDIR."login.php?auth=security_pin");
    // we have once chance to do a OTP.
    }
    $userdata $auth->getUserData();
    redirect(FUSION_REQUEST);
    }
    } else if (
    get('logout') === 'yes') {
    $userdata Authenticate::logOut();
    $request clean_request('', ['logout'], FALSE);
    redirect($request);
    } else {
    $userdata Authenticate::validateAuthUser();


    Ich hänge an diesen Problem schon seit Wochen. Ja ich habe Google genutzt und ich finde dort nichts was mir hilft. ChatGPT hilft auch nicht weiter


    Falls mir jemand den Fehler sagen kann wäre ich überglücklich. Ich muss dazu sagen ich bin kein Programmierer ich mache das aus Hobby und Spaß an der Freude und KI hilft mir sehr viel Dabei.

    Liebe Grüße und vielen Dank im voraus
    Daniel B.
    Alias Drakikosa

  • #2
    Hier mal die Debug Ausgaben die gesetzt werden nach dem Versuchten Steam Login



    Datei: cookie_check.log

    Code:
    {
    
        "_lcp": "a",
    
        "fusionuc223_visited": "yes",
    
        "_lcp2": "a",
    
        "wpcc": "dismiss",
    
        "tab_js-settings": "tab-url",
    
        "tab_js-security": "tab-postsec",
    
        "fusionuc223_session": "ba90884c906bb793cac57552943248e1",
    
        "PHPSESSID": "fc0838fbbc682c86a2e91cae32acc8fd",
    
        "fusionuc223_lastvisit": "1747675518"
    
    }​




    Datei: cookie_debug.log

    Code:
    Array
    
    (
    
        [COOKIE_DOMAIN] => roadrunner-transporte.com
    
        [COOKIE_PATH] => /
    
        [COOKIE_NAME] => fusionuc223_user
    
        [CookiesSent] => no
    
        [SESSION] => Array
    
            (
    
                [csrf_tokens] => Array
    
                    (
    
                        [9054363c1265594b3ae253534fd3ff44] => Array
    
                            (
    
                                [loginPageFrm] => Array
    
                                    (
    
                                        [0] => 2a00:fbc:ea6a:b3a2:31fe:28b0:d416:31df-1747679118-312ab6560aeed062c9603cf60fd3a73425fec9385f9ea39411bdd82783949e23
    
                                    )
    
    
    
                                [login-form] => Array
    
                                    (
    
                                        [0] => 2a00:fbc:ea6a:b3a2:31fe:28b0:d416:31df-1747679118-827cf492789dba79e2f9cae15ffa6c3502f8d39128d7ebe644aaf59c8d1c6f07
    
                                        [1] => 2a00:fbc:ea6a:b3a2:31fe:28b0:d416:31df-1747679657-5f8a5db116ef96bd99f5c99d7a7e73bd7bf72632e783c66d517f25329f2b9e62
    
                                        [2] => 2a00:fbc:ea6a:b3a2:31fe:28b0:d416:31df-1747679659-50044a095301c95f76a0419eba62551df0521053963a9b5052b212e9bae7e716
    
                                    )
    
    
    
                                [userinfopanel_login] => Array
    
                                    (
    
                                        [0] => 2a00:fbc:ea6a:b3a2:31fe:28b0:d416:31df-1747679657-ebf6700a20784c00aaf1d058d79e4039b911454a3596676a5f34e6b04e3a499a
    
                                        [1] => 2a00:fbc:ea6a:b3a2:31fe:28b0:d416:31df-1747679659-73cd7bba6cbc4aae6d6d9c6ae25072326be1d459f70b12861a4759d255667ceb
    
                                    )
    
    
    
                            )
    
    
    
                    )
    
    
    
                [honeypots] => Array
    
                    (
    
                        [9054363c1265594b3ae253534fd3ff44] => Array
    
                            (
    
                                [loginPageFrm_honeypot] => Array
    
                                    (
    
                                        [honeypot] => loginPageFrm_honeypot
    
                                        [input_name] => fusion_jAhQc6
    
                                        [form_name] => loginPageFrm
    
                                        [type] => honeypot
    
                                    )
    
    
    
                                [login-form_honeypot] => Array
    
                                    (
    
                                        [honeypot] => login-form_honeypot
    
                                        [input_name] => fusion_1wbWoC
    
                                        [form_name] => loginform
    
                                        [type] => honeypot
    
                                    )
    
    
    
                                [userinfopanel_login_honeypot] => Array
    
                                    (
    
                                        [honeypot] => userinfopanel_login_honeypot
    
                                        [input_name] => fusion_6aaAnT
    
                                        [form_name] => userinfopanel_login
    
                                        [type] => honeypot
    
                                    )
    
    
    
                            )
    
    
    
                    )
    
    
    
                [form_fields] => Array
    
                    (
    
                        [9054363c1265594b3ae253534fd3ff44] => Array
    
                            (
    
                                [user_name] => Array
    
                                    (
    
                                        [input_name] => user_name
    
                                        [title] => User name
    
                                        [id] => username
    
                                        [type] => text
    
                                        [required] => 1
    
                                        [safemode] =>
    
                                        [regex] =>
    
                                        [callback_check] =>
    
                                        [delimiter] => ,
    
                                        [min_length] => 1
    
                                        [max_length] => 200
    
                                        [censor_words] => 1
    
                                        [descript] => 1
    
                                    )
    
    
    
                                [user_pass] => Array
    
                                    (
    
                                        [input_name] => user_pass
    
                                        [title] => User pass
    
                                        [id] => userpassword
    
                                        [type] => password
    
                                        [required] => 1
    
                                        [safemode] =>
    
                                        [regex] =>
    
                                        [callback_check] =>
    
                                        [delimiter] => ,
    
                                        [min_length] => 1
    
                                        [max_length] => 200
    
                                        [censor_words] => 1
    
                                        [descript] => 1
    
                                    )
    
    
    
                                [remember_me] => Array
    
                                    (
    
                                        [input_name] => remember_me
    
                                        [title] => Angemeldet bleiben
    
                                        [id] => rememberme
    
                                        [type] => checkbox
    
                                        [required] =>
    
                                        [safemode] =>
    
                                        [error_text] => Du musst dieses Kästchen auswählen.
    
                                        [delimiter] => ,
    
                                    )
    
    
    
                            )
    
    
    
                    )
    
    
    
                [fusionuc223_user_id] => 1
    
                [fusionuc223_user_pass] => (pass wird richtig gesetzt)
    
                [fusionuc223_lastvisit] => 1747679666
    
            )
    
    
    
        [UserID] => 1
    
        [UserAlgo] => sha256
    
        [UserSalt] => (Salt wird richtig gesetzt)
    
    )​​
    ​​



    Datei: headers_check.php

    Code:
    X-Powered-By: PHPFusion 9.20.00
    
    Set-Cookie: fusionuc223_user=1.1748889266.0bd8f659ac56532fb56ef6cea72d8e8623ceeef64d9b13ca448625fe06a21cf1; expires=Mon, 02-Jun-2025 18:34:26 GMT; Max-Age=1209600; path=/; domain=roadrunner-transporte.com; secure; HttpOnly; SameSite=Lax​

    Comment

    Working...
    X