config/functions_remember.php reimplementa o desenho selector/validator do platform-tools (functions_remember.php) localmente, porque esta app tem autenticação própria e não passa por functions_auth.php partilhado: selector em claro e UNIQUE indexa a linha, só o SHA-256 do validator fica na BD, hash_equals() na comparação, rotação a cada uso, e um validator que não bate certo revoga TODOS os tokens da conta (sinal de cookie em circulação). - Checkbox no login; remember_issue() só quando marcada. - require_login() tenta remember_resume() antes de mandar para o login. - logout.php apaga só o token deste browser (não a conta toda). - auth_set_password() revoga todos os tokens da conta — uma password nova não pode deixar um cookie antigo continuar a entrar. Migração: database/migration_20260925_remember_me.sql (remember_tokens). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
26 lines
998 B
PHP
26 lines
998 B
PHP
<?php
|
|
// Ends the local session. Nothing to coordinate with an identity provider —
|
|
// this install owns its own sessions.
|
|
|
|
require __DIR__ . '/../../config/db.php';
|
|
require __DIR__ . '/../../config/functions.php';
|
|
|
|
if (!empty($_SESSION['user_id'])) {
|
|
audit('auth.logout', ['target_type' => 'user', 'target_id' => (int) $_SESSION['user_id']]);
|
|
// Só o token deste browser, não toda a conta: sair aqui não deve expulsar
|
|
// a pessoa de outro dispositivo onde pediu para ficar.
|
|
$cookie = remember_parse_cookie();
|
|
if ($cookie !== null) remember_delete($pdo, $cookie['selector']);
|
|
}
|
|
remember_forget_cookie();
|
|
$_SESSION = [];
|
|
// Drop the cookie too, so the browser doesn't keep presenting a dead id.
|
|
if (ini_get('session.use_cookies')) {
|
|
$p = session_get_cookie_params();
|
|
setcookie(session_name(), '', time() - 42000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
|
|
}
|
|
session_destroy();
|
|
|
|
header('Location: ' . base_url('views/auth/login.php?loggedout=1'));
|
|
exit;
|