2013-03-13 5 views
1

Я пытаюсь реализовать функцию Single Sign On для Disquss. У Disquss есть тестовая консоль, которая позволяет нам быстро проверить значения. Во-первых, мы убедились, что мы получили жесткие кодированные значения для работы с консолью, поэтому мы уверены, что понимаем требования Disquss. Затем мы хотели реализовать одно и то же в рельсах, но у нас проблема.HMACSHA1 in Rails - странный результат

Проблема заключается в том, что рубин не генерирующий ожидаемых значений, на самом деле он генерирует мусор, который полностью отличается формой ожидаемых значения:

THis от 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, сообщение + '' + временную метку)

После этого примера мы придуманной таял следующие рельсы кода (он все еще находится в стадии тестирования, следовательно, путы):

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ò Ø ™ `Õ«Ou © ≠ Δ8

, но мы должны получить что-то в этом формате:

4683eff451100191c60d2a0f0e72f3a6d15db950

Я пробовал разные вещи, но безрезультатно. Что может быть проблемой?

ответ

2

OpenSSL::HMAC.digest выводит необработанные байты, в то время как вы, кажется, хотите шестнадцатеричное представление

OpenSSL::HMAC.hexdigest выведет на экран в шестнадцатеричном формате. Конечно, вы можете преобразовать его сами тоже:

arbitary_data.unpack («H *») первый

будет заколдовать закодировать все байты..

+0

Это сделало трюк относительно формата мудрым. Все еще не работает, но в основном из-за неправильного кода или чего-то еще. будет больше работать над этим. –

0

У меня были подобные проблемы, и с помощью Debuger SSD Disqus в http://disqus.com/api/sso/ я определил, что сообщение получило разрыв строки, добавленный при кодировании Base64.

Реферирование base64 encode length parameter

Я изменил

puts @disqus_message = Base64.encode64(@disqus_serializer_message)  

в

puts @disqus_message = Base64.strict_encode64(@disqus_serializer_message) 

И теперь его работает просто отлично.

Смежные вопросы