diff --git a/.env.example b/.env.example index c0660ea..f310c63 100644 --- a/.env.example +++ b/.env.example @@ -20,7 +20,7 @@ LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug -DB_CONNECTION=sqlite +DB_CONNECTION=mysql # DB_HOST=127.0.0.1 # DB_PORT=3306 # DB_DATABASE=laravel @@ -63,3 +63,7 @@ AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" + +JWT_SECRET=replace_this_with_a_long_random_secret +JWT_TTL=3600 +JWT_ISSUER="${APP_NAME}" diff --git a/app/Http/Controllers/Auth/EsiScopeController.php b/app/Http/Controllers/Auth/EsiScopeController.php index d34e2c2..2030392 100644 --- a/app/Http/Controllers/Auth/EsiScopeController.php +++ b/app/Http/Controllers/Auth/EsiScopeController.php @@ -2,8 +2,18 @@ namespace App\Http\Controllers\Auth; +//Library use App\Http\Controllers\Controller; +use App\Models\Auth\User; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Laravel\Socialite\Facades\Socialite; +use Throwable; + +//Models +use App\Models\User\User; +use App\Models\Esi\EsiScope; class EsiScopeController extends Controller { @@ -28,5 +38,15 @@ class EsiScopeController extends Controller ])->get(); return view('scopes.select')->with('scopes', $scopes); - } + } + + /** + * Redirect to the socialite provider + * + * @return RequestResponse + */ + public function redirectToProvider(Request $request): RequestResponse + { + return Socialite::driver('eveonline')->setScopes($request->scopes)->redirect(); + } } diff --git a/app/Http/Controllers/Auth/EveLoginController.php b/app/Http/Controllers/Auth/EveLoginController.php index eb5eded..3c6aabf 100644 --- a/app/Http/Controllers/Auth/EveLoginController.php +++ b/app/Http/Controllers/Auth/EveLoginController.php @@ -2,14 +2,19 @@ namespace App\Http\Controllers\Auth; +//Library use App\Http\Controllers\Controller; -use App\Models\User; +use App\Models\Auth\User; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Laravel\Socialite\Facades\Socialite; use Throwable; +//Models +use App\Models\User\User; +use App\Models\Esi\EsiScope; + class EveLoginController extends Controller { public function showLogin() @@ -20,7 +25,7 @@ class EveLoginController extends Controller public function redirectToProvider(): RedirectResponse { // "eveonline" driver registered via SocialiteProviders - return Socialite::driver('eveonline')->redirect(); + return Socialite::driver('eveonline')->scopes(['publicData'])->redirect(); } public function handleProviderCallback(Request $request): RedirectResponse @@ -57,8 +62,12 @@ class EveLoginController extends Controller ] ); - Auth::login($user, true); + //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'); diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php deleted file mode 100644 index 664edca..0000000 --- a/app/Http/Controllers/Auth/LoginController.php +++ /dev/null @@ -1,98 +0,0 @@ -middleware('guest')->except(['logout', - 'handleProviderCallback', - 'redirectToProvider']); - } - - /** - * Logout function - * - * @return void - */ - public function logout() { - Auth::logout(); - return redirect('/'); - } - - /** - * Redirect to provider's website - * - * @return param - */ - public function redirectToEveonline() { - return Socialite::driver('eveonline')->scopes(['publicData'])->redirect(); - } - - /** - * Create a new controller instance - * - * @return void - */ - public function handleEveonlineCallback() { - try { - $user = Socialite::driver('eveonline')->user(); - $findUser = User::where('character_id', $user->character_id)->first(); - - if($findUser) { - Auth::login($finduser); - return redirect()->intended('home'); - } else { - $newUser = User::updateOrCreate(['character_id' => $user->character_id], [ - 'character_name' => $user->character_name, - 'character_id' => $user->character_id, - 'token' => $user->token, - 'refresh_token' => $user->refresh_token, - 'expiresIn' => $user->expiresIn, - 'user_jwt_token' => $user->user, - ]); - - Auth::login($newUser); - - return redirect()->intended('home'); - } - } catch(Exception $e) { - dd($e->getMessage()); - } - } - - /** - * Get token from callback - * Redirect to the dashboard if logging in successfully. - * - * @return redirect() - */ - public function handleProviderCallback(Socialite $social) { - //Get the sso user from the socialite driver - $ssoUser = $social->driver('eveonline')->user(); - - $scpSession = session()->pull('scopes'); - - $user = LoginHelper::createOrGetUser($ssoUser); - auth()->login($user, true); - return redirect()->to('/dashboard')->with('success', 'Successfully Logged In.'); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/AuthEveLoginController.php b/app/Http/Controllers/AuthEveLoginController.php deleted file mode 100644 index 4815daa..0000000 --- a/app/Http/Controllers/AuthEveLoginController.php +++ /dev/null @@ -1,10 +0,0 @@ -timestamp; + $ttl = (int) config('jwt.ttl', 3600); + + $payload = [ + 'iss' => config('jwt.issuer', config('app.name')), + 'sub' => (string) $user->id, + 'iat' => $now, + 'nbf' => $now, + 'exp' => $now + $ttl, + + // App-specific claims + 'character_id' => $user->character_id, + 'character_name' => $user->character_name, + 'character_owner_hash' => $user->character_owner_hash, + ]; + + return JWT::encode($payload, $secret, 'HS256'); + } + + public function decode(string $token): object + { + $secret = config('jwt.secret'); + + if (! $secret) { + throw new RuntimeException('JWT secret is not configured.'); + } + + return JWT::decode($token, new Key($secret, 'HS256')); + } +} \ No newline at end of file diff --git a/composer.json b/composer.json index ad59489..6e9e7f2 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "license": "MIT", "require": { "php": "^8.2", + "firebase/php-jwt": "^7.0", "laravel/framework": "^12.0", "laravel/horizon": "^5.44", "laravel/tinker": "^2.10.1", diff --git a/composer.lock b/composer.lock index 88208b2..36fa8e6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b238498d72621c2daf8235938fd6d8c3", + "content-hash": "31870f34ceff8a2b5f63b8f8ef750a53", "packages": [ { "name": "brick/math", @@ -510,16 +510,16 @@ }, { "name": "firebase/php-jwt", - "version": "v7.0.2", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65" + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5645b43af647b6947daac1d0f659dd1fbe8d3b65", - "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", "shasum": "" }, "require": { @@ -567,9 +567,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v7.0.2" + "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" }, - "time": "2025-12-16T22:17:28+00:00" + "time": "2026-02-25T22:16:40+00:00" }, { "name": "fruitcake/php-cors", diff --git a/config/jwt.php b/config/jwt.php new file mode 100644 index 0000000..d22d6e3 --- /dev/null +++ b/config/jwt.php @@ -0,0 +1,7 @@ + env('JWT_SECRET'), + 'ttl' => env('JWT_TTL', 3600), + 'issuer' => env('JWT_ISSUER', env('APP_NAME', 'Framework')), +]; \ No newline at end of file