Ich habe auf meiner Seite (PHPFusion 9.20) eine eigene Steam-Login-Integration gebaut.
Der Loginprozess funktioniert technisch gesehen vollständig:
Trotzdem erkennt PHPFusion den User nicht als eingeloggt – weder auf der Startseite noch im Userpanel.
Datei: init-openId.php
Datei: process-openId.php
Datei: Authenticate.php
Codeabschnitt 1:
Codeabschnitt 2:
Datei: maincore.php
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
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();
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($base, 0, 20);
$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($response, true);
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'], true, true, $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($_COOKIE, JSON_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);
}
}
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("/&/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
Comment