From 8e56bb86f1f522d5c266568763bf3def55e055c1 Mon Sep 17 00:00:00 2001 From: "iVampireSP.com" Date: Thu, 2 Feb 2023 13:51:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Module/AuthRequestController.php | 47 +++++++++++++++++++ app/Http/Controllers/Web/AuthController.php | 41 ++++++++++++++++ resources/views/auth/request.blade.php | 21 +++++++++ routes/modules.php | 5 ++ routes/web.php | 7 ++- 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Module/AuthRequestController.php create mode 100644 resources/views/auth/request.blade.php diff --git a/app/Http/Controllers/Module/AuthRequestController.php b/app/Http/Controllers/Module/AuthRequestController.php new file mode 100644 index 0000000..29b48db --- /dev/null +++ b/app/Http/Controllers/Module/AuthRequestController.php @@ -0,0 +1,47 @@ +validate([ + 'description' => 'required|string|max:255', + ]); + + $token = Str::random(128); + + $data = [ + 'description' => $request->input('description'), + 'token' => $token, + 'module' => $request->user('module')->toArray(), + ]; + + Cache::put('auth_request:'.$token, $data, 120); + + $data['url'] = route('auth_request.show', $token); + + return $this->success($data); + } + + public function show($token) + { + $data = Cache::get('auth_request:'.$token); + + if (empty($data)) { + return $this->error('Token 不存在或已过期。'); + } + + if (! isset($data['user'])) { + $data['user'] = []; + } + + return $this->success($data); + } +} diff --git a/app/Http/Controllers/Web/AuthController.php b/app/Http/Controllers/Web/AuthController.php index 62e57d4..12f1567 100644 --- a/app/Http/Controllers/Web/AuthController.php +++ b/app/Http/Controllers/Web/AuthController.php @@ -11,6 +11,7 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Cache; use Illuminate\View\View; use function redirect; use function session; @@ -100,4 +101,44 @@ public function logout(): RedirectResponse return redirect()->route('index'); } + + public function showAuthRequest($token): View|RedirectResponse + { + $data = Cache::get('auth_request:'.$token); + + if (empty($data)) { + return redirect()->route('index')->with('error', '登录请求的 Token 不存在或已过期。'); + } + + if (isset($data['user'])) { + return redirect()->route('index')->with('error', '登录请求的 Token 已被使用。'); + } + + return view('auth.request', [ + 'data' => $data, + ]); + } + + public function storeAuthRequest(Request $request): RedirectResponse + { + $request->validate([ + 'token' => 'required|string|max:128', + ]); + + $data = Cache::get('auth_request:'.$request->input('token')); + + if (empty($data)) { + return back()->with('error', '登录请求的 Token 不存在或已过期。'); + } + + if (isset($data['user'])) { + return back()->with('error', '登录请求的 Token 已被使用。'); + } + + $data['user'] = $request->user('web'); + + Cache::put('auth_request:'.$request->input('token'), $data, 120); + + return redirect()->route('index')->with('success', '登录请求已确认。'); + } } diff --git a/resources/views/auth/request.blade.php b/resources/views/auth/request.blade.php new file mode 100644 index 0000000..891e258 --- /dev/null +++ b/resources/views/auth/request.blade.php @@ -0,0 +1,21 @@ +@extends('layouts.app') + +@section('title', '认证') + +@section('content') + +

{{ $data['module']['name'] }} 想要获取你的用户信息。

+ +

{{ $data['description'] }}

+ + @auth('web') + +
+ @csrf + + +
+ + @endauth + +@endsection diff --git a/routes/modules.php b/routes/modules.php index afa01f4..75b8dab 100644 --- a/routes/modules.php +++ b/routes/modules.php @@ -1,5 +1,6 @@ where('path', '.*'); + +// 认证请求 +Route::post('auth_request', [AuthRequestController::class, 'store']); +Route::get('auth_request/{token}', [AuthRequestController::class, 'show']); diff --git a/routes/web.php b/routes/web.php index 9b60076..38c62c1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -35,7 +35,7 @@ Route::post('email/resend', [VerificationController::class, 'resend'])->name('verification.resend'); }); -Route::middleware(['auth', 'banned', 'verified'])->group( +Route::middleware(['auth:web', 'banned', 'verified'])->group( function () { /* Start 账户区域 */ Route::withoutMiddleware(['banned', 'verified'])->group( @@ -74,6 +74,11 @@ function () { Route::get('real_name', [RealNameController::class, 'create'])->name('real_name.create'); Route::post('real_name', [RealNameController::class, 'store'])->name('real_name.store'); /* End 实名认证 */ + + /* Start 匿名登录 */ + Route::get('auth_request/{auth_request}', [AuthController::class, 'showAuthRequest'])->withoutMiddleware(['auth:web', 'verified'])->name('auth_request.show'); + Route::post('auth_request', [AuthController::class, 'storeAuthRequest'])->name('auth_request.store'); + /* End 匿名登录 */ } );