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.
- 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.
- Instale o Go 1.26 ou posterior. No console, abra Integração rápida e crie um produto.
- 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.
go get github.com/spf86/licentivo-sdk@v0.11.63. 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.
// 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
- Execute uma vez com a chave de teste e confirme se o relatório existe.
- Remova LICENTIVO_LICENSE_KEY e execute novamente com o mesmo usuário: as credenciais salvas devem ser restauradas.
- Alterar a exportação para um recurso ausente na licença: a operação deve retornar um erro sem escrever um relatório.
- 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.