From 08ef14a420e4ab3e572d7f8dc4a5c7ec9b83169a Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Fri, 8 Mar 2024 03:35:41 +0800 Subject: [PATCH] oauth basic --- app/Exceptions/Handler.php | 4 ++ app/Http/Controllers/OauthController.php | 65 ++++++++++++++++++++++++ app/Http/Controllers/ToolController.php | 5 ++ app/Http/Middleware/Authenticate.php | 2 +- app/Http/Middleware/NexusAuth.php | 2 +- app/Http/Resources/UserResource.php | 2 +- config/auth.php | 3 +- include/constants.php | 2 +- routes/web.php | 7 ++- 9 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 app/Http/Controllers/OauthController.php diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 59151cd2..223194b8 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -11,6 +11,7 @@ use Illuminate\Validation\UnauthorizedException; use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Throwable; +use Laravel\Passport\Exceptions\AuthenticationException as PassportAuthenticationException; class Handler extends ExceptionHandler { @@ -48,6 +49,9 @@ class Handler extends ExceptionHandler return abort(403); } }); + $this->renderable(function (PassportAuthenticationException $e) { + return response()->redirectTo(getSchemeAndHttpHost() . "/login.php"); + }); //Other Only handle in json request if (!request()->expectsJson()) { diff --git a/app/Http/Controllers/OauthController.php b/app/Http/Controllers/OauthController.php new file mode 100644 index 00000000..8464b0d9 --- /dev/null +++ b/app/Http/Controllers/OauthController.php @@ -0,0 +1,65 @@ +baseUri = getSchemeAndHttpHost(); + } + public function Redirect(Request $request) + { + $request->session()->put('state', $state = Str::random(40)); + + $query = http_build_query([ + 'client_id' => $this->clientId, + 'redirect_uri' => $this->baseUri."/oauth/callback", + 'response_type' => 'code', + 'scope' => '', + 'state' => $state, + 'prompt' => 'none', // "none", "consent", or "login" + ]); + + return redirect($this->baseUri.'/oauth/authorize?'.$query); + + } + + public function Callback(Request $request) + { +// $state = $request->session()->pull('state'); +// +// throw_unless( +// strlen($state) > 0 && $state === $request->state, +// \InvalidArgumentException::class +// ); + + $clientInfo = Client::query()->findOrFail($this->clientId); + $response = Http::asForm()->post($this->baseUri.'/oauth/token', [ + 'grant_type' => 'authorization_code', + 'client_id' => $this->clientId, + 'client_secret' => $clientInfo->secret, + 'redirect_uri' => $this->baseUri.'/oauth/callback', + 'code' => $request->code, + ]); + + return $response->json(); + } + + + public function userInfo(): array + { + $user = Auth::user(); + $resource = new UserResource($user); + return $this->success($resource); + } +} diff --git a/app/Http/Controllers/ToolController.php b/app/Http/Controllers/ToolController.php index 3949f77c..16cc6f66 100644 --- a/app/Http/Controllers/ToolController.php +++ b/app/Http/Controllers/ToolController.php @@ -22,4 +22,9 @@ class ToolController extends Controller return $this->success($result); } + public function test(Request $request) + { + dd($request->all()); + } + } diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 704089a7..406f179b 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -15,7 +15,7 @@ class Authenticate extends Middleware protected function redirectTo($request) { if (! $request->expectsJson()) { - return route('login'); + return getBaseUrl() . '/login.php'; } } } diff --git a/app/Http/Middleware/NexusAuth.php b/app/Http/Middleware/NexusAuth.php index 883c75aa..9f68d9fb 100644 --- a/app/Http/Middleware/NexusAuth.php +++ b/app/Http/Middleware/NexusAuth.php @@ -15,7 +15,7 @@ class NexusAuth extends Middleware protected function redirectTo($request) { if (! $request->expectsJson()) { - return getSchemeAndHttpHost() . '/login.php'; + return getBaseUrl() . '/login.php'; } } } diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php index 039d8daa..012741f5 100644 --- a/app/Http/Resources/UserResource.php +++ b/app/Http/Resources/UserResource.php @@ -17,6 +17,7 @@ class UserResource extends JsonResource $out = [ 'id' => $this->id, 'username' => $this->username, + 'email' => $this->email, 'status' => $this->status, 'enabled' => $this->enabled, 'added' => format_datetime($this->added), @@ -40,7 +41,6 @@ class UserResource extends JsonResource 'valid_medals' => MedalResource::collection($this->whenLoaded('valid_medals')), ]; if ($request->routeIs('user.me')) { - $out['email'] = $this->email; $out['downloaded_human'] = mksize($this->downloaded); $out['uploaded_human'] = mksize($this->uploaded); $out['seed_time'] = mkprettytime($this->seedtime); diff --git a/config/auth.php b/config/auth.php index 0f43040f..893831a7 100644 --- a/config/auth.php +++ b/config/auth.php @@ -42,7 +42,8 @@ return [ ], 'api' => [ - 'driver' => 'token', +// 'driver' => 'token', + 'driver' => 'passport', 'provider' => 'users', 'hash' => false, ], diff --git a/include/constants.php b/include/constants.php index 71c1fd47..baf2e349 100644 --- a/include/constants.php +++ b/include/constants.php @@ -1,6 +1,6 @@ middleware(['web']); - +Route::group(['prefix' => 'oauth'], function () { + Route::get("user-info", [\App\Http\Controllers\OauthController::class, 'userInfo'])->name("oauth.user_info")->middleware('auth:api'); +// Route::get('redirect', [\App\Http\Controllers\OauthController::class, 'Redirect']); +// Route::get('callback', [\App\Http\Controllers\OauthController::class, 'Callback']); +});