84 lines
2.3 KiB
PHP
84 lines
2.3 KiB
PHP
<?php
|
||
declare(strict_types=1);
|
||
|
||
namespace app\api\cache;
|
||
|
||
use support\think\Cache;
|
||
|
||
/**
|
||
* 平台 auth-token Redis 缓存
|
||
* 用于 /api/v1/authToken 鉴权接口颁发的 token 存储与校验
|
||
*/
|
||
class AuthTokenCache
|
||
{
|
||
private static function devicePrefix(): string
|
||
{
|
||
return config('api.auth_token_device_prefix', 'api:auth_token:');
|
||
}
|
||
|
||
private static function tokenPrefix(): string
|
||
{
|
||
return config('api.auth_token_prefix', 'api:auth_token:t:');
|
||
}
|
||
|
||
private static function expire(): int
|
||
{
|
||
return (int) config('api.auth_token_exp', 86400);
|
||
}
|
||
|
||
/**
|
||
* 存储 auth-token(同一 agent_id 只保留最新一个)
|
||
* @param string $agentId 代理 ID
|
||
* @param string $token 生成的 auth-token
|
||
*/
|
||
public static function setToken(string $agentId, string $token): bool
|
||
{
|
||
if ($agentId === '' || $token === '') {
|
||
return false;
|
||
}
|
||
$exp = self::expire();
|
||
if ($exp <= 0) {
|
||
return false;
|
||
}
|
||
$oldToken = Cache::get(self::devicePrefix() . $agentId);
|
||
if ($oldToken !== null && $oldToken !== '') {
|
||
Cache::delete(self::tokenPrefix() . $oldToken);
|
||
}
|
||
Cache::set(self::tokenPrefix() . $token, $agentId, $exp);
|
||
Cache::set(self::devicePrefix() . $agentId, $token, $exp);
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 根据 agent_id 获取当前有效的 token,不存在或已过期返回 null
|
||
*/
|
||
public static function getTokenByAgentId(string $agentId): ?string
|
||
{
|
||
if ($agentId === '') {
|
||
return null;
|
||
}
|
||
$val = Cache::get(self::devicePrefix() . $agentId);
|
||
return $val !== null && $val !== '' ? (string) $val : null;
|
||
}
|
||
|
||
/**
|
||
* 根据 auth-token 获取 agent_id,不存在或已过期返回 null
|
||
*/
|
||
public static function getAgentIdByToken(string $token): ?string
|
||
{
|
||
if ($token === '') {
|
||
return null;
|
||
}
|
||
$val = Cache::get(self::tokenPrefix() . $token);
|
||
return $val !== null && $val !== '' ? (string) $val : null;
|
||
}
|
||
|
||
/**
|
||
* 校验 auth-token 是否有效
|
||
*/
|
||
public static function isValidToken(string $token): bool
|
||
{
|
||
return self::getAgentIdByToken($token) !== null;
|
||
}
|
||
}
|