user = $user; } public function generateAuthData(): array { // Create a new Sanctum token with device info $token = $this->user->createToken( Str::random(20), // token name (device identifier) ['*'], // abilities now()->addYear() // expiration ); // Format token: remove ID prefix and add Bearer $tokenParts = explode('|', $token->plainTextToken); $formattedToken = 'Bearer ' . ($tokenParts[1] ?? $tokenParts[0]); return [ 'token' => $this->user->token, 'auth_data' => $formattedToken, 'is_admin' => $this->user->is_admin, ]; } public function getSessions(): array { return $this->user->tokens()->get()->toArray(); } public function removeSession(string $sessionId): bool { $this->user->tokens()->where('id', $sessionId)->delete(); return true; } public function removeAllSessions(): bool { $this->user->tokens()->delete(); return true; } public static function findUserByBearerToken(string $bearerToken): ?User { $token = str_replace('Bearer ', '', $bearerToken); $accessToken = PersonalAccessToken::findToken($token); return $accessToken?->tokenable; } /** * 解密认证数据 * * @param string $authorization * @return array|null 用户数据或null */ public static function decryptAuthData(string $authorization): ?array { $user = self::findUserByBearerToken($authorization); if (!$user) { return null; } return [ 'id' => $user->id, 'email' => $user->email, 'is_admin' => (bool)$user->is_admin, 'is_staff' => (bool)$user->is_staff ]; } }