202509021110

使用後台驗証帳號
This commit is contained in:
allen.yan 2025-09-02 11:10:44 +08:00
parent 40fbeb6a63
commit d7854a9905
5 changed files with 81 additions and 3 deletions

View File

@ -0,0 +1,36 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use App\Models\User; // 如果你的 Token 存在 user table
class ApiTokenMiddleware
{
public function handle(Request $request, Closure $next)
{
$token = $request->bearerToken();
if (!$token) {
return response()->json(['error' => 'Missing token'], 401);
}
$response = Http::withToken($token)
->withOptions(['verify' => false])
->post('https://ktv.test/api/token/validate');
if ($response->failed() || !$response->json('valid')) {
return response()->json(['error' => 'Invalid token'], 401);
}
$user = User::where('api_plain_token', $token)->first();
if (!$user) {
return response()->json(['message' => 'Invalid token'], 401);
}
$request->setUserResolver(fn() => $user);
return $next($request);
}
}

View File

@ -13,6 +13,7 @@ return Application::configure(basePath: dirname(__DIR__))
) )
->withMiddleware(function (Middleware $middleware) { ->withMiddleware(function (Middleware $middleware) {
$middleware->alias([ $middleware->alias([
'api_token' => \App\Http\Middleware\ApiTokenMiddleware::class,
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class, 'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class, 'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class 'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class

View File

@ -35,4 +35,8 @@ return [
], ],
], ],
'backend' => [
'url' => env('BACKEND_URL'),
],
]; ];

View File

@ -1,6 +1,7 @@
<?php <?php
use App\Livewire\Forms\LoginForm; use App\Livewire\Forms\LoginForm;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Session;
use Livewire\Attributes\Layout; use Livewire\Attributes\Layout;
use Livewire\Volt\Component; use Livewire\Volt\Component;
@ -16,7 +17,43 @@ new #[Layout('layouts.guest')] class extends Component
{ {
$this->validate(); $this->validate();
$this->form->authenticate(); //$this->form->authenticate();
// 呼叫遠端 API 驗證帳號密碼
$response = Http::withOptions(['verify' => false])
->post(config('services.backend.url').'/api/login', [
'email' => $this->form->email,
'password' => $this->form->password,
]);
if ($response->failed()) {
throw \Illuminate\Validation\ValidationException::withMessages([
'email' => '登入失敗,請檢查帳號或密碼。',
]);
}
$data = $response->json("data");
// 假設遠端回傳 token + user profile
$token = $data['token'];
$userData = $data['user'];
// 在本地建立/更新使用者
$user = \App\Models\User::updateOrCreate(
[ 'id' => $userData['id']],
[
'name' => $userData['name'],
'email' => $userData['email'],
'phone' => $userData['phone'],
'birthday' => $userData['birthday'],
'gender' => $userData['gender'],
'status' => $userData['status'],
'email_verified_at' => $userData['email_verified_at'],
'created_at' => $userData['created_at'],
'updated_at' => $userData['updated_at'],
'api_token' => $token,
]
);
Auth::login($user, remember: true);
Session::regenerate(); Session::regenerate();

View File

@ -1,7 +1,6 @@
<?php <?php
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ArtistController;
use App\Http\Controllers\AuthController; use App\Http\Controllers\AuthController;
use App\Http\Controllers\RoomControlController; use App\Http\Controllers\RoomControlController;
use App\Http\Controllers\Api\RoomSongController; use App\Http\Controllers\Api\RoomSongController;
@ -9,7 +8,8 @@ use App\Http\Controllers\SqliteUploadController;
Route::post('/room/receiveRegister', [RoomControlController::class, 'receiveRegister']); Route::post('/room/receiveRegister', [RoomControlController::class, 'receiveRegister']);
Route::middleware('auth:sanctum')->group(function () { //Route::middleware('auth:sanctum')->group(function () {
Route::middleware('api_token')->group(function () {
Route::get('/profile', [AuthController::class, 'profile']); Route::get('/profile', [AuthController::class, 'profile']);
Route::post('/room/sendSwitch', [RoomControlController::class, 'sendSwitch']); Route::post('/room/sendSwitch', [RoomControlController::class, 'sendSwitch']);
Route::post('/room/heartbeat', [RoomControlController::class, 'HeartBeat']); Route::post('/room/heartbeat', [RoomControlController::class, 'HeartBeat']);