Setup completo del portal interno donna.aal-law.com: * Landing público con OAuth login + grid de apps autenticado * Flujo OAuth2 contra Mailcow (mail.aal-law.com) * Sesiones SSO compartidas en el dominio (cookie donna_session, 8h) * Whitelist de dominios aal-law.com / aalnlaw.com * App "Control de Escrituras" migrada desde ZH-Consultores/control-escrituras (mismo schema, mismo frontend, ahora con shared Auth/Db/Config libs) * Migraciones SQL para users, escrituras_tramites, escrituras_historial * Caddy on :80 con rewrite extless → .php * Backup diario MariaDB (systemd timer + script) con retención 14d * Documentación de arquitectura en README + infra files en docs/infra
66 lines
2.2 KiB
PHP
66 lines
2.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
require_once __DIR__ . '/Config.php';
|
|
|
|
final class Oauth {
|
|
public static function exchangeCodeForToken(string $code): array {
|
|
return self::httpPost(Config::get('OAUTH_TOKEN_URL'), [
|
|
'grant_type' => 'authorization_code',
|
|
'code' => $code,
|
|
'redirect_uri' => Config::get('OAUTH_REDIRECT_URI'),
|
|
'client_id' => Config::get('OAUTH_CLIENT_ID'),
|
|
'client_secret' => Config::get('OAUTH_CLIENT_SECRET'),
|
|
]);
|
|
}
|
|
|
|
public static function fetchProfile(string $accessToken): array {
|
|
return self::httpGetBearer(Config::get('OAUTH_PROFILE_URL'), $accessToken);
|
|
}
|
|
|
|
private static function httpPost(string $url, array $form): array {
|
|
$ch = curl_init($url);
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_POST => true,
|
|
CURLOPT_POSTFIELDS => http_build_query($form),
|
|
CURLOPT_HTTPHEADER => ['Accept: application/json'],
|
|
CURLOPT_TIMEOUT => 10,
|
|
CURLOPT_CONNECTTIMEOUT => 5,
|
|
CURLOPT_SSL_VERIFYPEER => true,
|
|
CURLOPT_SSL_VERIFYHOST => 2,
|
|
]);
|
|
$body = curl_exec($ch);
|
|
$err = curl_error($ch);
|
|
curl_close($ch);
|
|
if ($err || $body === false) {
|
|
error_log('oauth POST failed: ' . $err);
|
|
return [];
|
|
}
|
|
return json_decode((string)$body, true) ?? [];
|
|
}
|
|
|
|
private static function httpGetBearer(string $url, string $token): array {
|
|
$ch = curl_init($url);
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => [
|
|
'Authorization: Bearer ' . $token,
|
|
'Accept: application/json',
|
|
],
|
|
CURLOPT_TIMEOUT => 10,
|
|
CURLOPT_CONNECTTIMEOUT => 5,
|
|
CURLOPT_SSL_VERIFYPEER => true,
|
|
CURLOPT_SSL_VERIFYHOST => 2,
|
|
]);
|
|
$body = curl_exec($ch);
|
|
$err = curl_error($ch);
|
|
curl_close($ch);
|
|
if ($err || $body === false) {
|
|
error_log('oauth GET failed: ' . $err);
|
|
return [];
|
|
}
|
|
return json_decode((string)$body, true) ?? [];
|
|
}
|
|
}
|