Реалізація генерації та валідації ліцензійних ключів на сайті

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація генерації та валідації ліцензійних ключів на сайті
Середня
~3-5 робочих днів
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація генерації та валідації лицензійних ключів на сайте

Лицензійний ключ — це рядок, який кодує права: який продукт, який план, дата істечення. Валідація повинна працювати як онлайн (API), так і офлайн (криптографічна перевірка підписи).

Формати ключів

Простий випадковий ключ: A3K7M-XQ2WP-N8VLR-5HZTB-J4YCS

Зберігає тільки унікальність. Усі дані про ліцензію — на сервері. Онлайн-валідація обов'язкова.

Ключ з даними (Partial Key Verification): Частина ключа кодує атрибути ліцензії. Дозволяє часткову офлайн-валідацію.

JWT-токен: eyJhbGciOiJSUzI1NiJ9... — повноцінний токен з корисною нагрузкою та RSA-підписом.

Генерація JWT-ліцензій

Асиметрична RSA-підпис дозволяє клієнтському приложенню перевірити ліцензію без звернення до сервера, використовуючи лише публічний ключ:

use Firebase\JWT\JWT;

class LicenseTokenService
{
    public function issue(License $license): string
    {
        $privateKey = file_get_contents(storage_path('keys/license_private.pem'));

        return JWT::encode([
            'iss'        => 'example.com',
            'iat'        => now()->timestamp,
            'exp'        => $license->expires_at?->timestamp ?? 9999999999,
            'license_id' => $license->id,
            'product'    => $license->product_code,
            'plan'       => $license->plan,
            'seats'      => $license->max_seats,
            'features'   => $license->features,
        ], $privateKey, 'RS256');
    }

    public function verify(string $token): array
    {
        $publicKey = file_get_contents(storage_path('keys/license_public.pem'));
        $payload   = JWT::decode($token, new Key($publicKey, 'RS256'));
        return (array) $payload;
    }
}

Валідація в приложенні (офлайн)

// C# приклад для desktop-приложення
public class LicenseChecker
{
    private readonly string publicKey = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQEAr...
-----END PUBLIC KEY-----";

    public LicenseResult Validate(string token)
    {
        var handler   = new JwtSecurityTokenHandler();
        var validation = new TokenValidationParameters
        {
            ValidateIssuer           = true,
            ValidIssuer              = "example.com",
            ValidateIssuerSigningKey = true,
            IssuerSigningKey         = GetPublicKey(),
            ValidateLifetime         = true,
        };

        try
        {
            var principal = handler.ValidateToken(token, validation, out _);
            return new LicenseResult { IsValid = true, Plan = GetClaim(principal, "plan") };
        }
        catch (SecurityTokenExpiredException)
        {
            return new LicenseResult { IsValid = false, Error = "License expired" };
        }
    }
}

API для валідації

Route::post('/api/v1/licenses/validate', function (Request $request) {
    $key = $request->input('key');

    $license = License::where('key', $key)->first();

    if (!$license) {
        return response()->json(['valid' => false, 'error' => 'Invalid key'], 404);
    }

    $checks = [
        'active'     => $license->status === 'active',
        'not_expired'=> !$license->expires_at || now()->isBefore($license->expires_at),
        'seats_ok'   => $license->activations()->where('revoked', false)->count() < $license->max_activations,
    ];

    $valid = !in_array(false, $checks);

    return response()->json([
        'valid'      => $valid,
        'product'    => $license->product_code,
        'plan'       => $license->plan,
        'expires_at' => $license->expires_at,
        'errors'     => array_keys(array_filter($checks, fn($v) => !$v)),
    ]);
});

Сроки

Генерація та валідація лицензійних ключів з JWT та API: 4–6 робочих днів.