Audit vom 11.09. gegen HEAD geprüft, Entwicklungsplan dazu unter dev/2026-09-11-audit/ENTWICKLUNGSPLAN.md. Dieser Commit ist Deploy A: die sechs kleinen Punkte aus Block 1 ohne Schemaänderung. F01: Der Fortify-Endpunkt PUT /user/profile-information tauschte die E-Mail sofort und setzte die Verifizierung zurück; der Login-Sync vergab danach Firmenrechte allein nach E-Mail-Treffer. Feature abgeschaltet (die Kunden-UI hat den pending_email-Prozess), und der Sync verlangt jetzt ein verifiziertes, aktives Konto – für alle Aufrufer. F02: Google-Login übergibt Konten mit bestätigtem TOTP in die Challenge, wie Passwort- und Magic-Link-Login. F03: showRecoveryCodes ist gesperrt; ein Client-Update konnte die Recovery-Codes entschlüsseln lassen. F08: Nutzer-Detailroute unter can:users:manage (persistente Livewire- Middleware), Gutschriften autorisieren zusätzlich in der Action. F09: Gate::before greift nur für aktive Super-Admins; deaktivierte fallen auf die Gates mit is_active-Prüfung zurück. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
78 lines
2.5 KiB
PHP
78 lines
2.5 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Auth;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use App\Listeners\RecordAuthActivity;
|
||
use App\Services\Auth\SocialAuthService;
|
||
use App\Support\LoginRedirect;
|
||
use Illuminate\Http\RedirectResponse;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Auth;
|
||
use Laravel\Socialite\Facades\Socialite;
|
||
|
||
/**
|
||
* Google-Login (WS-6). Erst-Login legt – de-dupliziert über die E-Mail – einen
|
||
* aktiven, verifizierten customer-Account an; bestehende Accounts werden nur
|
||
* verknüpft. Deaktivierte Accounts werden nicht reaktiviert.
|
||
*/
|
||
class GoogleController extends Controller
|
||
{
|
||
public function redirect(): RedirectResponse
|
||
{
|
||
return Socialite::driver('google')->redirect();
|
||
}
|
||
|
||
public function callback(Request $request, SocialAuthService $social): RedirectResponse
|
||
{
|
||
try {
|
||
$googleUser = Socialite::driver('google')->user();
|
||
} catch (\Throwable) {
|
||
return redirect()->route('login')->withErrors([
|
||
'email' => __('Die Anmeldung mit Google ist fehlgeschlagen. Bitte versuchen Sie es erneut.'),
|
||
]);
|
||
}
|
||
|
||
$user = $social->resolveUser(
|
||
'google',
|
||
(string) $googleUser->getId(),
|
||
$googleUser->getEmail(),
|
||
$googleUser->getName(),
|
||
);
|
||
|
||
if (! $user || ! $user->is_active) {
|
||
return redirect()->route('login')->withErrors([
|
||
'email' => __('Ihr Konto ist nicht aktiv. Bitte wenden Sie sich an den Support.'),
|
||
]);
|
||
}
|
||
|
||
// 2FA aktiv: wie Passwort- und Magic-Link-Login nicht direkt einloggen,
|
||
// sondern in Fortifys Challenge übergeben (Audit F02). Google belegt
|
||
// den Besitz des Postfachs, nicht den zweiten Faktor.
|
||
if ($user->hasEnabledTwoFactorAuthentication()) {
|
||
$request->session()->put([
|
||
'login.id' => $user->getKey(),
|
||
'login.remember' => true,
|
||
]);
|
||
|
||
$request->session()->regenerate();
|
||
|
||
return redirect()->route('two-factor.challenge');
|
||
}
|
||
|
||
$request->attributes->set(RecordAuthActivity::AUTH_METHOD_ATTRIBUTE, 'google');
|
||
Auth::login($user, remember: true);
|
||
$request->session()->regenerate();
|
||
|
||
$user->forceFill([
|
||
'last_login_at' => now(),
|
||
'last_login_ip' => $request->ip(),
|
||
])->save();
|
||
|
||
return redirect(LoginRedirect::safeTarget(
|
||
$user,
|
||
$request->session()->pull('url.intended'),
|
||
LoginRedirect::homeFor($user),
|
||
));
|
||
}
|
||
}
|