2013-03-13 105 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) 

而现在它的工作就好了。