我試圖通過ruby TCPSocket與HiveServer2進行通信。根據Thrift SASL規範,我發送START消息,然後發送簡單的身份驗證信息。 服務器用空有效負載返回COMPLETE狀態。它應該作爲有效載荷返回挑戰,但是會返回空字符串。如何與運行NONE身份驗證的HiveServer2進行通信
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]
從服務器收到完整的狀態之後,我可以用TCLIService ::客戶端與HiveServer2溝通。只有一件事要注意:
所有寫入底層傳輸的寫入必須以有效負載數據的4字節長度爲前綴,後面跟有有效負載。從此傳輸的所有讀取 應讀取4個字節的長度字,然後讀取由此長度字指定的全部數量的字節 。
已經嘗試過,連接掛起thrift/hiveserver2 gem,因爲服務器期望收到'START'消息。所以我正在實現我自己的支持SASL機制的gem。 – KolobocK
問題解決了!此外,沒有任何問題:)狀態5完成與一個空的挑戰確定爲無驗證類型。 STARTTLS的最終代碼位於原始帖子中 – KolobocK