Ir para o conteúdo
LICENTIVO / INTEGRATION

Adicionar licenciamento de software a um aplicativo Go

Instale o Go SDK, ative com chave do cliente e proteja uma exportação de arquivo real. O SDK gerencia a identidade do dispositivo, autorização assinada, credenciais salvas e pulsações.

Cerca de 15 minutos com Go instaladoAtualizado

1. Prepare um produto e licença

Use este caminho para um utilitário de desktop, aplicativo de linha de comando ou serviço que precise de uma licença bloqueada por nó. Comece com um recurso de exportação ilimitada para poder verificar o licenciamento antes de adicionar contadores de uso.

A cota conta as ativações atuais e retorna ao liberá-las. Licenças comuns continuam contando offline; licenças flutuantes também devolvem a cota quando a concessão expira.

  1. Copie o ID do produto em Console > Produtos. Abra as chaves públicas de assinatura do mesmo produto e insira todos os pares ID da chave/chave pública no código de inicialização, substituindo YOUR_PRODUCT_ID, YOUR_KEY_ID e YOUR_PUBLIC_KEY. A integração rápida pode gerar esse código. Não é necessário um arquivo de configuração; o SDK usa https://www.licentivo.com por padrão.
  2. Instale o Go 1.26 ou posterior. No console, abra Integração rápida e crie um produto.
  3. Habilite um recurso chamado exportação na política de autorização do produto. Crie ou selecione uma licença de teste.

2. Instale o SDK em seu projeto

Instale o SDK 0.11.6 com o comando abaixo no seu projeto ou adicione a dependência de compilação. O gerenciador de pacotes obtém o SDK; não é preciso baixar e extrair código-fonte nem configurar caminhos locais.

Terminal
go get github.com/spf86/licentivo-sdk@v0.11.6

3. Proteja uma operação

Inicialize o SDK ao iniciar ou ativar seu software. Leia a chave do cliente no formulário e passe o ID do produto e as chaves confiáveis. Mantenha o cliente até o encerramento. Coloque RunFeature na operação real e substitua a exportação pela sua função.

Go · complete main.go
// One protected operation. Keep the client alive for the lifetime of your app.
package main

import (
	"context"
	"fmt"
	licentivo "github.com/spf86/licentivo-sdk"
	"os"
)

// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
const productID = "YOUR_PRODUCT_ID"

var trustedKeys = map[string]string{"YOUR_KEY_ID": "YOUR_PUBLIC_KEY"}

// END LICENTIVO PRODUCT

func setting(name, fallback string) string {
	if value := os.Getenv(name); value != "" {
		return value
	}
	return fallback
}

// Call this at the business entry point, including keyboard/menu/CLI actions.
func exportReport(path string) error {
	// Replace this write with your existing, non-metered export operation.
	return os.WriteFile(path, []byte("A report generated by the licensed application.\n"), 0600)
}

func run() error {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	// In a GUI, obtain key from the activation input. Later starts use an empty key.
	client, err := licentivo.OpenProduct(ctx, productID, trustedKeys, os.Getenv("LICENTIVO_LICENSE_KEY"), func(err error) {
		fmt.Fprintln(os.Stderr, "Background verification:", err)
	})
	if err != nil {
		return err
	}
	defer client.Close() // Floating seats return; node-locked registration stays.
	feature := setting("LICENTIVO_FEATURE", "export")
	path := setting("LICENTIVO_OUTPUT", "licensed-report.txt")
	action := func() error { return exportReport(path) }
	if os.Getenv("LICENTIVO_METERED") == "1" {
		err = client.RunMeteredFeature(ctx, feature, 1, os.Getenv("LICENTIVO_OPERATION_ID"), action)
	} else {
		err = client.RunFeature(feature, action)
	}
	if err != nil {
		return err
	}
	fmt.Printf("License OK: %s is available\nExport completed: %s\n", feature, path)
	return nil
}

func main() {
	if err := run(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(2)
	}
}

4. Mantenha um cliente durante a vida útil do aplicativo

Em um aplicativo real, abra o cliente na inicialização e coloque RunFeature dentro do botão de exportação ou manipulador de comando. Mantenha o cliente ativo até o desligamento. Fechar interrompe o trabalho em segundo plano; ele preserva o registro normal bloqueado por nó.

O SDK armazena uma credencial vinculada à máquina após a ativação. Inicializações posteriores podem passar uma chave vazia e restaurá-la a partir da mesma conta de usuário e local de cache. Você não precisa armazenar IDs de ativação ou enviar HTTP pulsações por conta própria.

Uma concessão offline válida bloqueada por nó pode ser restaurada imediatamente enquanto o SDK é atualizado online em segundo plano. Uma política flutuante ou somente online precisa de uma resposta bem-sucedida do servidor. Nunca trate um erro em segundo plano registrado como permissão para ignorar uma falha na verificação de recurso.

5. Verifique as operações permitidas e negadas

  1. Execute uma vez com a chave de teste e confirme se o relatório existe.
  2. Remova LICENTIVO_LICENSE_KEY e execute novamente com o mesmo usuário: as credenciais salvas devem ser restauradas.
  3. Alterar a exportação para um recurso ausente na licença: a operação deve retornar um erro sem escrever um relatório.
  4. Verifique uma reinicialização offline somente quando a política permitir e o contrato assinado ainda for válido.

Problemas comuns de integração

Confira o ID do produto, todos os pares ID da chave/chave pública e a licença do cliente. As chaves públicas pertencem ao produto; licenças e credenciais de dispositivos são separadas. Não distribua chaves de teste ou API Keys de gerenciamento.

Um recurso negado exige a verificação do nome do recurso e da política de licença; RunFeature verifica o direito, não o uso restante. Use RunMeteredFeature para um contador.

Os limites do dispositivo, uma licença expirada ou uma negação explícita do servidor exigem que o cliente ou fornecedor resolva a autorização. Mostre o erro e o ID da solicitação, quando disponível. Nunca inclua chaves de gerenciamento de fornecedores no aplicativo.