first(); if ($aiModel) { return self::encode([ 'uid' => $aiModel->uid, 'id' => 0, 'typ' => self::AI_MODEL_TOKEN_TYPE, 'ver' => (int) $aiModel->token_version, ], self::AI_MODEL_TOKEN_TTL); } $user = UserApi::getByUuid($userUid); if (! $user || ! isset($user['sn'])) { // 查无此人时 UserApi 返回的是 id=0 的占位结构,不能拿它签 token return null; } return self::encode([ 'uid' => $user['id'], 'id' => $user['sn'], ], self::USER_TOKEN_TTL); } public static function getJwtKey() { return config('mint.app.jwt_secrets_key'); } public static function getToken(Request $request) { $token = $request->bearerToken(); return $token; } public static function current(Request $request) { $token = $request->bearerToken(); if ($token) { try { $jwt = JWT::decode($token, new Key(self::getJwtKey(), 'HS512')); } catch (\Exception $e) { return false; } if ($jwt->exp < time()) { // 过期 return false; } if (! self::modelTokenIsValid($jwt)) { return false; } // 有效的token return ['user_uid' => $jwt->uid, 'user_id' => $jwt->id]; } elseif (isset($_COOKIE['user_uid'])) { return [ 'user_uid' => $_COOKIE['user_uid'], 'user_id' => $_COOKIE['user_id'], ]; } else { return false; } } /** * 校验模型身份 token 是否已被撤销。 * * 撤销即把 ai_models.token_version 自增,旧 token 里的 ver 随即对不上。 * 模型被删除同样视为失效。人类 token(id 为用户自增主键,恒 > 0)直接放行,不查库。 */ private static function modelTokenIsValid(object $jwt): bool { if (isset($jwt->typ) && $jwt->typ === self::AI_MODEL_TOKEN_TYPE) { $version = AiModel::where('uid', $jwt->uid)->value('token_version'); return $version !== null && (int) $version === (int) ($jwt->ver ?? 0); } // 引入版本号之前签出的模型 token(typ 缺失、id 恒为 0)无法撤销,一律作废, // 持有者须重新签发。 return (int) ($jwt->id ?? 0) !== 0; } /** * @param array $claims */ private static function encode(array $claims, int $ttl): string { return JWT::encode(array_merge([ 'nbf' => time(), 'exp' => time() + $ttl, ], $claims), self::getJwtKey(), 'HS512'); } }