增加 模块登录请求

This commit is contained in:
iVampireSP.com 2023-02-02 13:51:32 +08:00
parent 302e8d46b3
commit 8e56bb86f1
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
5 changed files with 120 additions and 1 deletions

View File

@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Module;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class AuthRequestController extends Controller
{
public function store(Request $request)
{
$request->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);
}
}

View File

@ -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', '登录请求已确认。');
}
}

View File

@ -0,0 +1,21 @@
@extends('layouts.app')
@section('title', '认证')
@section('content')
<h3><code>{{ $data['module']['name'] }}</code> 想要获取你的用户信息。</h3>
<p>{{ $data['description'] }}</p>
@auth('web')
<form method="POST" action="{{ route('auth_request.store') }}">
@csrf
<input type="hidden" name="token" value="{{ $data['token'] }}">
<button type="submit" class="btn btn-primary">同意</button>
</form>
@endauth
@endsection

View File

@ -1,5 +1,6 @@
<?php
use App\Http\Controllers\Module\AuthRequestController;
use App\Http\Controllers\Module\BroadcastController;
use App\Http\Controllers\Module\DeviceController;
use App\Http\Controllers\Module\HostController;
@ -36,3 +37,7 @@
// 模块间调用
Route::any('modules/{module}/{path?}', [ModuleController::class, 'exportCall'])
->where('path', '.*');
// 认证请求
Route::post('auth_request', [AuthRequestController::class, 'store']);
Route::get('auth_request/{token}', [AuthRequestController::class, 'show']);

View File

@ -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 匿名登录 */
}
);