es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ZeroMQ – Obtener el ID de usuario de la respuesta de autenticación de ZeroMQ.

En ZeroMQ, más precisamente en mi caso con cppzmq, cuando se usa ZAP, se maneja de forma completamente transparente para el usuario.

Sin embargo, según se documenta en el RFC: https://rfc.zeromq.org/spec/27/, el servidor de autenticación puede devolver un ID de usuario y algunos metadatos en la respuesta:

El mensaje de respuesta DEBE consistir en los siguientes marcos de mensaje:
– Un marco de delimitador de dirección, que DEBE tener una longitud de cero.
– El marco de versión, que DEBE contener los tres octetos “1.0”.
– El ID de solicitud, que PUEDE contener un blob binario opaco.
– El código de estado, que DEBE contener una cadena.
– El texto de estado, que PUEDE contener una cadena.
El ID de usuario, que DEBE contener una cadena.
– Los metadatos, que PUEDE contener un blob.

Un poco más adelante, precisa el significado de ID de usuario :

ID de usuario: PUEDE proporcionar la identidad del usuario en caso de un estado 200, para su uso por parte de las aplicaciones. Para otros estados, DEBE estar vacío.

Mi pregunta es: ¿Cómo se puede recuperar el ID de usuario de la respuesta con cppzmq?

Pequeño ejemplo de código para mostrar lo que quiero decir:

void client() {
  zmq::context<em> context;
  zmq::socket</em>t socket (context, zmq::socket<em>type::req);
  socket.set(zmq::sockopt::zap</em>domain, "global");
  socket.set(zmq::sockopt::plain<em>username, "user");
  socket.set(zmq::sockopt::plain</em>password, "password");

  socket.connect("tcp://127.0.0.1:4242");
  ...
  std::string auth<em>user</em>id = /* función mágica aquí */;

}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para recuperar el ID de usuario de la respuesta ZAP en cppzmq, se puede utilizar la clase zmq::message_t para recibir los fotogramas del mensaje de respuesta ZAP y luego recuperar el fotograma del ID de usuario usando el método zmq_msg_data() para acceder a su contenido.

    El código de ejemplo para recuperar el ID de usuario es el siguiente:

    void cliente() {
      zmq::context_t contexto;
      zmq::socket_t socket(contexto, zmq::socket_type::req);
      socket.set(zmq::sockopt::zap_domain, "global");
      socket.set(zmq::sockopt::plain_username, "usuario");
      socket.set(zmq::sockopt::plain_password, "contraseña");
    
      socket.connect("tcp://127.0.0.1:4242");
    
      // enviar la solicitud y recibir la respuesta
      zmq::message_t solicitud(5);
      memcpy(solicitud.data(), "hola", 5);
      socket.send(solicitud);
    
      zmq::message_t respuesta;
      socket.recv(&respuesta);
    
      // recuperar el fotograma del ID de usuario desde el mensaje de respuesta ZAP
      std::string auth_user_id;
      if (zmq_msg_size(&respuesta) >= 6) {  // el fotograma del ID de usuario debe tener al menos 6 bytes de longitud
        char* datos = (char*)zmq_msg_data(&respuesta);
        if (datos[0] == 0 && memcmp(datos+1, "1.0", 3) == 0) {  // comprobar la versión de ZAP
          int pos = 5;
          while (pos < zmq_msg_size(&respuesta)) {
            int len = zmq_msg_size(&respuesta) - pos;
            char* frame_data = datos + pos;
            if (*frame_data == 0) {  // fotograma del delimitador de la dirección
              ++pos;
              break;
            }
            else if (memcmp(frame_data, "200", 3) == 0) {  // código de estado 200
              if (len > 3 && memcmp(frame_data+3, "OK", 2) == 0) {  // texto de estado "OK"
                int user_id_len = strnlen(frame_data+5, len-5);  // longitud del fotograma del ID de usuario
                if (user_id_len <= len-5) {
                  auth_user_id = std::string(frame_data+5, user_id_len);  // copiar el contenido del fotograma del ID de usuario
                }
              }
            }
            pos += len + 1;  // avanzar al siguiente fotograma
          }
        }
      }
    
      // utilizar auth_user_id según sea necesario
    }
    

    Este código primero envía un mensaje de solicitud con el dominio ZAP, el nombre de usuario y la contraseña configurados para la autenticación. Luego recibe un mensaje de respuesta e intenta recuperar el fotograma del ID de usuario a partir de él. El código comprueba que la versión de ZAP y el código de estado sean válidos y luego busca el fotograma del ID de usuario mediante la iteración sobre los fotogramas en el mensaje hasta que encuentra el primer fotograma del delimitador de la dirección. Luego comprueba que el texto de estado sea “OK” y recupera la longitud del fotograma del ID de usuario a partir de los datos del fotograma. Finalmente, copia el contenido del fotograma del ID de usuario en una variable std::string auth_user_id que puede ser utilizada por la aplicación.

Comments are closed.