add OAUth2.0

This commit is contained in:
2026-06-15 11:14:35 +02:00
parent 7973a94498
commit 69f4d6a602
32 changed files with 1126 additions and 51 deletions
@@ -35,6 +35,9 @@
<a href="#calendario" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-calendar-alt mr-2"></i> Calendario
</a>
<a href="#google-services" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fab fa-google mr-2"></i> Google Services
</a>
<a href="#tipologie" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-file mr-2"></i> Tipologie Documenti
</a>
@@ -397,6 +400,19 @@
<h3 class="card-title">Configurazione Server IMAP</h3>
</div>
<div class="card-body">
<div class="form-group">
<label for="auth_method">Metodo di autenticazione</label>
<select name="auth_method" id="auth_method" class="form-control">
<option value="password" {{ ($emailSettings->auth_method ?? 'password') === 'password' ? 'selected' : '' }}>Password / App Password</option>
<option value="oauth" {{ ($emailSettings->auth_method ?? 'password') === 'oauth' ? 'selected' : '' }}>OAuth 2.0 (Google)</option>
</select>
<small class="form-text text-muted">
<i class="fas fa-info-circle"></i>
Scegli "OAuth 2.0" per usare il token OAuth centralizzato di Google.
Per Gmail con password, usa una
<a href="https://support.google.com/accounts/answer/185833" target="_blank">App Password</a>.
</small>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
@@ -846,6 +862,85 @@
</div>
</div>
{{-- === GOOGLE SERVICES === --}}
<div class="tab-pane" id="google-services">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title"><i class="fab fa-google mr-2"></i> Google Services</h3>
<div class="card-tools">
<a href="{{ route('google.oauth.status') }}" class="btn btn-sm btn-info">
<i class="fas fa-eye mr-1"></i> Stato Dettagliato
</a>
</div>
</div>
<div class="card-body">
<p class="text-muted">Gestisci le connessioni OAuth 2.0 centralizzate per Gmail, Google Drive e Google Calendar. Ogni servizio può essere configurato separatamente.</p>
@php
$gsvc = app(\App\Services\GoogleOAuthService::class);
$gservices = [
\App\Enums\GoogleService::Gmail,
\App\Enums\GoogleService::Drive,
\App\Enums\GoogleService::Calendar,
];
@endphp
@if(session('success'))
<div class="alert alert-success alert-dismissible">
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
{{ session('success') }}
</div>
@endif
@if(session('error'))
<div class="alert alert-danger alert-dismissible">
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
{{ session('error') }}
</div>
@endif
<div class="row">
@foreach($gservices as $svc)
@php $gAuth = $gsvc->isAuthorized($svc); @endphp
<div class="col-md-4">
<div class="card">
<div class="card-header" style="border-left: 4px solid {{ $svc->hexColor() }}">
<h3 class="card-title">
<i class="{{ $svc->icon() }}"></i>
{{ $svc->label() }}
</h3>
</div>
<div class="card-body">
<hr>
@if($gAuth)
<span class="badge bg-success"><i class="fas fa-check-circle"></i> Connected</span>
<form action="{{ route('google.oauth.revoke', $svc->value) }}" method="POST" class="d-inline">
@csrf @method('DELETE')
<button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Revocare l\'accesso a {{ $svc->label() }}?')">
<i class="fas fa-ban mr-1"></i> Revoca
</button>
</form>
@else
<span class="badge bg-secondary"><i class="fas fa-times-circle"></i> Non connesso</span>
<a href="{{ route('google.oauth.authorize', $svc->value) }}" class="btn btn-primary btn-sm">
<i class="fas fa-plug mr-1"></i> Connetti
</a>
@endif
</div>
</div>
</div>
@endforeach
</div>
<div class="alert alert-info mt-3">
<i class="fas fa-info-circle mr-2"></i>
<strong>Nota:</strong> Se utilizzi Gmail con OAuth 2.0, torna al tab
<a href="#email" class="alert-link" data-toggle="tab">Email</a>
e imposta il campo "Metodo di autenticazione" su "OAuth 2.0" nelle impostazioni IMAP.
</div>
</div>
</div>
</div>
{{-- === TIPOLOGIE DOCUMENTI === --}}
<div class="tab-pane active" id="tipologie">
<div class="card card-primary">