¿Qué es una licencia de membresía?
Una licencia de membresía es una clave de producto ligada a una membresía activa en lugar de a una compra única. La copia que tiene el miembro de tu plugin, script o bot comprueba la clave cada cierto tiempo: funciona mientras dura la membresía, se detiene cuando la membresía termina y vuelve a funcionar si se une de nuevo. La membresía es la licencia. Esa es la frase que usa Nadi: tu membresía es la licencia.
Por qué existe esto
Cualquiera que venda un producto que se ejecuta (un plugin para una app de diseño, un script, un bot, una pequeña herramienta web) conoce el desequilibrio. La venta ocurre una vez y el trabajo no se acaba nunca: una actualización después de cada versión nueva de la app anfitriona, preguntas, correcciones y un comprador de hace dos años que todavía te escribe.
Una suscripción arregla la parte del dinero y deja una pregunta abierta: ¿qué hace que merezca la pena renovarla? Si el producto sigue funcionando en manos de alguien que dejó de pagar, renovar es una donación.
Una licencia de membresía ata los dos extremos. Mientras la persona es miembro, su copia funciona. Cuando la membresía termina, se detiene. Cuando vuelve, funciona otra vez. El gran software profesional lleva años funcionando así; lo nuevo es vincular la clave a la membresía en una comunidad en lugar de a una compra única.
Cómo funciona: una clave, una comprobación y un periodo de gracia
Tres piezas, y cada una resuelve un problema evidente.
- La clave. Una cadena larga y aleatoria que pertenece a un miembro y a un producto. Una plataforma cuidadosa la guarda de forma ilegible, no tal como está escrita, para que nadie que lea la base de datos pueda leer las claves.
- La comprobación. Tu producto envía la clave a una dirección y recibe una respuesta corta: válida o no válida. Unas pocas líneas dentro de tu producto, y ningún servidor que mantener.
- El periodo de gracia. Cada sí llega con una fecha de caducidad firmada. El producto conserva la aprobación durante ese tiempo y no vuelve a preguntar hasta que caduca, así que funciona sin conexión. La firma impide que alguien edite un archivo en su propio equipo para alargarlo.
El periodo de gracia es lo que hace que la idea sea usable. Sin él, la conexión a internet se convierte en un requisito para usar el producto, y tu cliente deja de trabajar en un avión. Con él, lo peor que puede pasar es que alguien que se fue siga trabajando unos días más: un precio muy justo por un producto que no se rompe.
La pregunta que más importa: qué pasa cuando el servidor de licencias está caído
Esto es lo que separa un diseño en el que puedes confiar de uno en el que no. Tu producto pregunta y no llega respuesta: se cortó la conexión, la plataforma está caída, la respuesta tardó demasiado. ¿Qué debería hacer el producto?
Debería seguir funcionando. Solo una negativa explícita (una respuesta que diga claramente que esta clave está revocada o es desconocida) puede detener un producto. El silencio, un error y un tiempo de espera agotado no son negativas, y tratarlos como tales significa que la caída de otro rompe tu producto delante de tu cliente.
En una línea: ante la duda, se sigue funcionando; ante la certeza, se corta. Pregunta por este comportamiento exacto antes de construir sobre cualquier plataforma, y lee el código que te dicen que pegues en tu producto. Si trata un fallo de red como una revocación, quien paga es tu reputación.
Qué se puede licenciar con honestidad y qué no
El límite es sencillo: lo que se ejecuta se puede licenciar; lo que no, no. Una comprobación es el producto llamando a casa, y un archivo estático no puede llamar a ningún sitio.
- Un plugin, un script, una app, un bot: se ejecuta, así que puede preguntar, y puedes impedir que funcione. Aquí la licencia es real.
- Una imagen, un archivo de audio, un documento, un paquete de presets: se descarga una vez y se conserva. Nada en él le pregunta nada a nadie, y no hay forma de recuperarlo después.
Así que decir que un archivo estático tiene licencia es una afirmación que nadie puede hacer cumplir. El mecanismo honesto para esos casos es la propia puerta: la membresía es lo que permite la descarga, y quien se va no recibe la siguiente versión. Eso es cierto y útil; simplemente no es una licencia, y nunca debería venderse como tal.
Qué preguntarle a cualquier plataforma
Seis preguntas bastan para juzgar cualquier implementación de esta idea:
- ¿La clave muere en el mismo momento que la membresía, o en un ciclo mensual o un proceso nocturno?
- Si el miembro vuelve, ¿vuelve su clave antigua, o tiene que pegar una nueva en tu producto?
- ¿Cuánto dura el periodo de gracia, quién lo fija, y está firmada la respuesta para que no se pueda falsificar?
- ¿Qué dice el endpoint cuando la plataforma está caída: «no puedo responder» o «no válida»?
- ¿Cuántas líneas lleva la integración, y necesitas un servidor o una base de datos propios?
- ¿Se ofrece el interruptor de licencia en cosas en las que la licencia nunca se podría aplicar? Una plataforma que te deja licenciar un archivo estático te está vendiendo una apariencia, no un mecanismo.
Un ejemplo práctico: cómo lo hace Nadi
Nadi es una plataforma de comunidades, así que esta es la parte en la que describimos nuestro propio producto. Solo lo que hace hoy.
- El propietario activa la licencia en un elemento de la biblioteca de su comunidad, y cada miembro recibe su propia clave, que se muestra en la ficha del elemento con un botón para copiarla.
- La clave es válida mientras la membresía sigue viva, y devuelve REVOKED en el momento en que muere, ya sea porque el miembro se fue, porque lo expulsaron o porque su suscripción caducó.
- Cuando vuelve a unirse, revive el mismo registro, así que nadie tiene que pegar una clave nueva en ningún sitio.
- La integración son unas diez líneas en tu producto. Comprueba la clave una vez por semana y entre una y otra sigue funcionando sin conexión.
- El periodo de gracia es de siete días por defecto, y la respuesta va firmada, así que tu producto puede distinguir nuestro token de gracia de un archivo que alguien editó en su propio equipo.
- El endpoint, ante la duda, deja que el producto siga funcionando. Cuando no podemos responder, lo decimos, y nunca decimos «no válida» en su lugar. Una caída de nuestro lado nunca se disfraza de revocación.
- El propietario ve quién usa el elemento, el estado de cada titular (funcionando o detenido) y cuándo se registró su producto por última vez.
- Publicar una nueva versión del elemento avisa solo a los titulares de clave, no a toda la comunidad.
- El mensaje de rechazo que ve un miembro cuya membresía terminó nombra la comunidad y dice qué hace que el producto vuelva a funcionar: volver a unirse a ella.
Los límites, con franqueza
En Nadi, nada puede llamarse «con licencia» hasta que haya demostrado que puede serlo. El interruptor sigue apagado en cada elemento, archivo o enlace hasta que el propio producto de ese elemento haya llamado a nuestra comprobación con una clave real al menos una vez: el producto demuestra el mecanismo delante de nosotros antes de que se permita poner la palabra «Con licencia» en su página. Por eso, un archivo que un miembro descarga y que nunca se conecta a la comprobación no aparece como «con licencia» en ningún lugar de nuestro producto; su mecanismo honesto es la puerta, donde la membresía es lo que permite la descarga. Desactivar una licencia siempre está permitido.
Seguir funcionando ante la duda es un compromiso, no una carencia. El endpoint responde «no disponible» cuando no puede consultar la base de datos, y el fragmento de código que te damos trata todo lo que no sea una respuesta explícita como permiso para seguir funcionando. Eso significa que alguien que se fue puede seguir trabajando hasta que se le acabe el periodo de gracia, y lo aceptamos a propósito: los productos de otros no deben romperse porque un despliegue nuestro haya tenido un tropiezo.
Dos últimos límites. Una clave viene con la membresía, y hoy no hay forma de tener una sin unirse. Y una clave que se comparte sigue siendo una sola clave ligada a una sola membresía: se detiene cuando esa membresía se detiene.