Files
Xboard/app/Services/AuthService.php
2025-04-14 02:12:42 +08:00

86 lines
2.1 KiB
PHP

<?php
namespace App\Services;
use App\Models\User;
use Illuminate\Support\Str;
use Laravel\Sanctum\PersonalAccessToken;
class AuthService
{
private User $user;
public function __construct(User $user)
{
$this->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
];
}
}