scopes(['publicData'])->redirect(); } public function handleProviderCallback(Request $request, JwtService $jwtService): RedirectResponse { try { $ssoUser = Socialite::driver('eveonline')->user(); $characterId = strtr($ssoUser['sub'], ['CHARACTER:EVE:' => '']); $characterName = $ssoUser['name']; $characterOwnerHash = $ssoUser['owner']; $avatar = 'https://image.eveonline.com/Character/' . $characterId . '_128.jpg'; $token = $ssoUser->token; $refreshToken = $ssoUser->refreshToken ?? null; $expiresIn = $ssoUser->expiresIn ?? null; $scopes = is_array($ssoUser['scp']) ? $ssoUser['scp'] : [$ssoUser['scp']]; //Add user to the database $user = User::updateOrCreate( ['character_id' => $characterId], [ 'avatar' => $avatar, 'character_name' => $characterName, 'character_owner_hash' => $characterOwnerHash, 'token' => $token, 'refresh_token' => $refreshToken, 'expiresIn' => $expiresIn, ] ); //Add scopes to the scope database EsiScope::where(['character_id' => $characterId])->delete(); foreach($scopes as $scope) { $data = new EsiScope; $data->character_id = $characterId; $data->scope = $scope; $data->save(); } //Add Esi Token to the token database $esiToken = EsiToken::updateOrCreate( ['character_id' => $characterId], [ 'token' => $token, 'refresh_token' => $refreshToken, 'expiresIn' => $ssoUser->expiresIn, 'inserted_at' => time(), 'expires_in' => $expiresIn, ] ); // Always regenerate JWT on successful login $jwtService->forceRefresh($user); Auth::login($user, true); $request->session()->regenerate(); return redirect()->route('dashboard'); } catch (ClientException $e) { Log::error('EVE SSO Client Exception', [ 'message' => $e->getMessage(), 'exception' => get_class($e), ]); return redirect() ->route('login') ->with('error', 'EVE token exchange failed. Check client ID, client secret, and redirect URI.'); } catch (Throwable $e) { Log::error('EVE SSO callback failed', [ 'message' => $e->getMessage(), 'exception' => get_class($e), ]); report($e); return redirect() ->route('login') ->with('error', 'SSO login failed. Please try again.'); } } }