2013-03-13 38 views
1

我試圖實現Disquss的Single Sign On功能。 Disquss有一個測試控制檯,可以讓我們快速測試這些值。首先,我們確保我們獲得了硬編碼值與控制檯一起工作,所以我們確信我們理解了Disquss需求。接下來,我們想在rails中實現同樣的事情,但是我們在這裏遇到了問題。Rails中的HMACSHA1 - 奇怪的結果

問題是這樣的事實:紅寶石部未產生預期值,事實上,它產生的垃圾,這完全是不同形式的預期值:

這是從Disquss手冊:

該消息體(Base64編碼)

消息體必須包括以下大小寫敏感性質除非另有說明:

id - any unique user ID associated with that account within your user database. This will be used to generate a unique username to reference in the Disqus system. IDs must be completely unique; if you're using multiple datastores locally, for example, make sure not to re-use IDs when passing them to Disqus as that will result in account conflicts. 
username - The displayed name for that account 
email - The registered email address for that account 
avatar (optional) - A link to that user's avatar 
url (optional) - A link to the user's website 

HMAC-SHA1使用HMAC-> SHA1(SECRET_KEY,消息+ '' +時間戳)

此之後例如我們設計thew下列導軌代碼(它仍然是在測試階段生成的簽名

,因此看跌期權):

secret_key = "12312312312312312312312312312312312312312312312312" 
    digest = OpenSSL::Digest::Digest.new('sha1') 
    puts @disqus_timestamp = Date.today.to_time.to_i 
    puts @disqus_serializer_message = {"id"=> session[:frontend_user].to_s,"username"=>@fuser.username,"email"=>@fuser.email }.to_json 
    puts @disqus_message = Base64.encode64(@disqus_serializer_message)  
    puts @disqus_signature = OpenSSL::HMAC.digest(digest,secret_key,@disqus_message + ' '+ @disqus_timestamp.to_s) 
    puts @sso_payload = "" 
    puts "END" 

我們應該得到三個值: 1. JSON序列化格式,如:

eyJ1c2VybmFtZSI6InZlZHJhbiBtYXJpY2V2aWMiLCJpZCI6IjgiLCJlbWFp bCI6IndleC5hbHBoYUBnbWFpbC5jb20ifQ ==

Json的作品

  1. 已計算HMAC: 我們收到此類型的格式:

5œ[ƒmòØ™`O「的OU ©≠Δ8

但我們應該以這種形式來得到的東西:

4683eff451100191c60d2a0f0e72f3a6d15db950

我嘗試不同的東西,但無濟於事。可能是什麼問題?

回答

2

OpenSSL::HMAC.digest輸出的原始字節,而你似​​乎想要的十六進制表示十六進制格式

OpenSSL::HMAC.hexdigest將輸出。當然,你可以自己進行轉換也:

arbitary_data.unpack(「H *」)第一

將十六進制編碼的所有字節。

+0

這樣做的格式明智的伎倆。仍然不起作用,但主要是由於錯誤的代碼或其他東西。將在這方面做更多的工作。 – 2013-03-13 14:33:05

0

我遇到了類似的問題,在http://disqus.com/api/sso/上使用Disqus SSO Debuger,我確定消息在執行Base64編碼時增加了換行符。

引用base64 encode length parameter

我改變

puts @disqus_message = Base64.encode64(@disqus_serializer_message)  

puts @disqus_message = Base64.strict_encode64(@disqus_serializer_message) 

而現在它的工作就好了。