90 lines
3.1 KiB
PHP
90 lines
3.1 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Auth;
|
||
|
||
//Library
|
||
use App\Http\Controllers\Controller;
|
||
use Illuminate\Http\RedirectResponse;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Auth;
|
||
use Laravel\Socialite\Facades\Socialite;
|
||
use Throwable;
|
||
use Illuminate\Support\Facades\Log;
|
||
use Debugbar;
|
||
|
||
//Models
|
||
use App\Models\Auth\User;
|
||
use App\Models\Esi\EsiScope;
|
||
|
||
class EveLoginController extends Controller
|
||
{
|
||
public function showLogin()
|
||
{
|
||
return view('auth.eve');
|
||
}
|
||
|
||
public function redirectToProvider(): RedirectResponse
|
||
{
|
||
// "eveonline" driver registered via SocialiteProviders
|
||
return Socialite::driver('eveonline')->scopes(['publicData'])->redirect();
|
||
}
|
||
|
||
public function handleProviderCallback(Request $request): RedirectResponse
|
||
{
|
||
try {
|
||
// Stateless can help in some deployments, but keep stateful by default.
|
||
// If you run into "Invalid state" issues behind proxies, switch to ->stateless()
|
||
$ssoUser = Socialite::driver('eveonline')->user();
|
||
Debugbar::info($ssoUser);
|
||
|
||
// Socialite user basics
|
||
$characterId = (int) $ssoUser->getId();
|
||
Debugbar::info($characterId);
|
||
$characterName = $ssoUser->getName() ?: ($ssoUser->getNickname() ?? 'Unknown');
|
||
Debugbar::info($characterName);
|
||
|
||
// Provider-specific extra payload sometimes appears in user array / token response.
|
||
// We’ll defensively extract what we can.
|
||
$raw = $ssoUser->user ?? [];
|
||
$characterOwnerHash =
|
||
$raw['CharacterOwnerHash'] ?? $raw['character_owner_hash'] ?? $raw['owner_hash'] ?? '';
|
||
Debugbar::info($characterOwnerHash);
|
||
|
||
$token = $ssoUser->token;
|
||
Debugbar::info($token);
|
||
$refreshToken = $ssoUser->refreshToken ?? null;
|
||
Debugbar::info($refreshTokeen);
|
||
$expiresIn = $ssoUser->expiresIn ?? null;
|
||
Debugbar::info($expiresIn);
|
||
|
||
$user = User::updateOrCreate(
|
||
['character_id' => $characterId],
|
||
[
|
||
'character_name' => $characterName,
|
||
'character_owner_hash' => $characterOwnerHash,
|
||
'token' => $token,
|
||
'refresh_token' => $refreshToken,
|
||
'expiresIn' => $expiresIn,
|
||
// "user" holds jwt - you can set it later when you add JWT issuance.
|
||
'user_jwt' => null,
|
||
]
|
||
);
|
||
Debugbar::info($user);
|
||
|
||
//Issue JWT and store in the "user" column per your spec
|
||
$jwt = $jwtService->make($user);
|
||
$user->user = $jwt;
|
||
$user->save();
|
||
|
||
Auth::login($user, true);
|
||
$request->session()->regenerate();
|
||
|
||
return redirect()->route('dashboard');
|
||
} catch (Throwable $e) {
|
||
// For now: fail back to login with a generic error.
|
||
// Later you can add logging/telemetry.
|
||
Debugbar::addThrowable($e);
|
||
return redirect()->route('login')->with('error', 'SSO Login Failed.');
|
||
}
|
||
}
|
||
} |