mirror of
https://github.com/lkddi/Xboard.git
synced 2026-04-03 18:40:52 +08:00
86 lines
2.1 KiB
PHP
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
|
|
];
|
|
}
|
|
}
|