FSCash/html/api/v1/_auth.php
fds2610-bot 03a6cf774d Feature: lesende API für den Buchungsabgleich (Issue #13)
Neue, rein lesende HTTP-Schnittstelle für den Finanzmanager:
GET /api/v1/buchungen sucht Buchungen anhand Zeitraum, Betrag (mit
Toleranz) und Währung; GET /api/v1/status dient als Verbindungstest.
Beide sind per HTTP Basic Auth mit den bestehenden FSCash-Zugangsdaten
geschützt und rechnen die intern positiv geführten Bargeldausgaben in
die vom Finanzmanager erwartete Vorzeichenkonvention (Ausgaben negativ)
um.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 07:31:31 +02:00

38 lines
1.2 KiB
PHP

<?php
declare(strict_types=1);
/**
* Prüft die HTTP-Basic-Auth-Zugangsdaten der lesenden API (Issue #13) gegen
* die bestehende FSCash-Benutzertabelle (dieselben Zugangsdaten wie beim
* Login). Bei fehlender oder falscher Authentifizierung wird sofort eine
* 401-Antwort gesendet und die Ausführung beendet.
*/
function fscash_api_require_auth(PDO $pdo): void
{
$authHeader = $_SERVER['HTTP_AUTHORIZATION']
?? $_SERVER['REDIRECT_HTTP_AUTHORIZATION']
?? null;
$credentials = fscash_parse_basic_auth_header($authHeader);
$authenticated = false;
if ($credentials !== null) {
$stmt = $pdo->prepare('SELECT password FROM users WHERE username = :username');
$stmt->execute(['username' => $credentials['username']]);
$hash = $stmt->fetchColumn();
if ($hash !== false && password_verify($credentials['password'], $hash)) {
$authenticated = true;
}
}
if (!$authenticated) {
header('WWW-Authenticate: Basic realm="FSCash API"');
http_response_code(401);
echo json_encode(
fscash_api_error('Zugangsdaten fehlen oder stimmen nicht.'),
JSON_UNESCAPED_UNICODE
);
exit;
}
}