Nyx con Ejemplos

AUTH y tokens en nyx-kv

AUTH autentica un cliente con un token. Cada token acota los comandos a un namespace, dando aislamiento por tenant. Los tokens de admin pueden emitir TOKEN_LIST y TOKEN_REVOKE.

Código

// nyx-kv AUTH -- multi-tenant authentication with tokens

fn resp_cmd(parts: Array) -> String {
    var sb: StringBuilder = StringBuilder.new()
    sb.append("*")
    sb.append(int_to_string(parts.length()))
    sb.append("\r\n")
    var i: int = 0
    while i < parts.length() {
        let p: String = parts[i]
        sb.append("$")
        sb.append(int_to_string(p.length()))
        sb.append("\r\n")
        sb.append(p)
        sb.append("\r\n")
        i = i + 1
    }
    return sb.to_string()
}

fn main() -> int {
    let fd: int = tcp_connect("127.0.0.1", 6380)
    if fd < 0 {
        print("connection failed")
        return 1
    }

    // Authenticate with a token -- subsequent commands are scoped to this tenant
    let token: String = "my-api-token-123"
    tcp_write(fd, resp_cmd(["AUTH", token]))
    let auth_reply: String = tcp_read_line(fd)
    print("AUTH -> " + auth_reply.trim())

    // After auth, SET/GET operate in the tenant's namespace
    tcp_write(fd, resp_cmd(["SET", "config:db", "postgres://localhost"]))
    let set_reply: String = tcp_read_line(fd)
    print("SET (authed) -> " + set_reply.trim())

    // List all tokens (admin command, requires privileged AUTH)
    tcp_write(fd, resp_cmd(["TOKEN_LIST"]))
    let list_hdr: String = tcp_read_line(fd)
    print("TOKEN_LIST header -> " + list_hdr.trim())

    // Revoke a token (also admin-only)
    tcp_write(fd, resp_cmd(["TOKEN_REVOKE", "old-token"]))
    let revoke: String = tcp_read_line(fd)
    print("TOKEN_REVOKE -> " + revoke.trim())

    tcp_close(fd)
    return 0
}

Salida

AUTH -> +OK
SET (authed) -> +OK
TOKEN_LIST header -> *2
TOKEN_REVOKE -> +OK

Explicación

nyx-kv extiende el modelo AUTH de Redis con un registro de tokens: cada token está atado a un prefijo de namespace, y los comandos emitidos en esa conexión quedan acotados silenciosamente a ese namespace. Dos tenants con tokens distintos pueden escribir en config:db sin colisionar nunca — el servidor reescribe la clave interna a <tenant>:config:db al vuelo.

Un subconjunto de tokens lleva el rol de admin. Las conexiones admin pueden emitir TOKEN_CREATE name namespace, TOKEN_LIST, y TOKEN_REVOKE token para gestionar el registro en tiempo de ejecución — sin necesidad de reiniciar el servidor. Esto convierte a una única instancia de nyx-kv en un backend multi-tenant de autoservicio, ideal para despliegues SaaS donde cada cliente obtiene un keyspace aislado.

En producción, rotá los tokens con un cronograma, guardalos cifrados en reposo, y nunca loguees los strings crudos del token.

← Anterior Siguiente →

Source: examples/by-example/74-kv-auth.nx