我正在尝试通过ruby TCPSocket与HiveServer2进行通信。根据Thrift SASL规范,我发送START消息,然后发送纯auth信息。 服务器返回COMPLETE状态,空载荷。它应该将challenge作为有效负载返回,但是返回一个空字符串。
START = 0x01
OK = 0x02
COMPLETE = 0x05
auth = 'PLAIN'
header = [START, auth.length].pack('cl>')
auth_string = ['anonymous'].pack('u')
auth_message = "[LOGIN] \u0000 #{auth_string} \u0000 #{auth_string}"
auth_header = [OK, auth_message.length].pack('cl>')
socket = TCPSocket.new localhost, 10000
socket.write header + auth
socket.write auth_header + auth_message
socket.read(5).unpack('cl>')
=> [5,0]
HiveServer2返回5状态为COMPLETE。 通过此套接字无法进一步通信,因为服务器不再返回任何内容。
我怀疑auth_message以错误的方式构建或其他错误。
有人能建议HiveServer2理解我的请求吗?
任何帮助将不胜感激。
UPD:Thrift SASL spec
UPD2:解决了! STARTTLS块应如下所示:
START = 0x01
OK = 0x02
COMPLETE = 0x05
auth = 'PLAIN'
header = [START, auth.length].pack('cl>')
auth_message = "[ANONYMOUS]\u0000anonymous\u0000anonymous"
auth_header = [OK, auth_message.length].pack('cl>')
socket = TCPSocket.new localhost, 10000
socket.write header + auth
socket.write auth_header + auth_message
socket.read(5).unpack('cl>')
=> [5,0]
从服务器收到COMPLETE状态后,我可以使用TCLIService :: Client与HiveServer2进行通信。只有一点需要注意:
对底层传输的所有写入必须以有效载荷数据的4字节长度为前缀,后跟有效载荷。所有读取都来自此运输 应该读取4字节长度的字,然后读取完整的字节数 由这个长度字指定。