validate([ 'email' => ['required', 'email'], 'password' => ['required', 'string'], 'device_name' => ['sometimes', 'string', 'max:100'], ]); $user = User::query() ->where('email', $data['email']) ->first(); if (! $user || ! Hash::check($data['password'], $user->password)) { throw ValidationException::withMessages([ 'email' => ['The provided credentials are incorrect.'], ]); } // Native two-factor and passkey challenges are not implemented yet. // Never issue a token to an account requiring these challenges. if ( ! empty($user->two_factor_secret) || ! empty($user->two_factor_confirmed_at) ) { return response()->json([ 'message' => 'This account requires additional authentication.', 'code' => 'additional_authentication_required', ], 403); } $token = $user->createToken( $data['device_name'] ?? 'HelpdeskMac', ['helpdesk:native'], now()->addDays(30) ); return response()->json([ 'token_type' => 'Bearer', 'access_token' => $token->plainTextToken, 'expires_at' => $token->accessToken->expires_at?->toIso8601String(), 'user' => $this->userData($user), ]); } public function user(Request $request): JsonResponse { return response()->json([ 'user' => $this->userData($request->user()), ]); } public function logout(Request $request): JsonResponse { $token = $request->user()->currentAccessToken(); if ($token instanceof PersonalAccessToken) { $token->delete(); } return response()->json([ 'message' => 'Logged out successfully.', ]); } private function userData(User $user): array { return [ 'id' => $user->getKey(), 'name' => $user->name, 'email' => $user->email, 'helpdesk_agent' => $user->isHelpdeskAgent(), 'helpdesk_admin' => $user->isHelpdeskAdmin(), ]; } }