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>
38 lines
1.2 KiB
PHP
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;
|
|
}
|
|
}
|