2013-05-15 37 views
0

我試圖通過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個字節的長度字,然後讀取由此長度字指定的全部數量的字節 。

回答

0

嘗試使用節儉寶石並考慮使用https://github.com/dallasmarlow/hiveserver2而不是Ruby套接字。

+0

已經嘗試過,連接掛起thrift/hiveserver2 gem,因爲服務器期望收到'START'消息。所以我正在實現我自己的支持SASL機制的gem。 – KolobocK

+0

問題解決了!此外,沒有任何問題:)狀態5完成與一個空的挑戰確定爲無驗證類型。 STARTTLS的最終代碼位於原始帖子中 – KolobocK

相關問題