Może brakuje w nagłówku żądania “Content-type” wartości charset=UTF-8 ?
Dlaczego dostaję komunikat o niepoprawnym hashu przesłanej wiadomości?
Przyczyną może być złe obliczanie funkcji hash w przypadku gdy użyto niepoprawnego kodowania
polskich znaków. Polskie znaki powinny być zakodowane zgodnie z UTF-8.
Okazuje się, że sama zabawa w szyfrowanie nie wystarczy, trzeba jeszcze wygenerowany klucz zamienić w ten sposób, że każde 2 kolejne znaki traktujemy jako liczbę heksadecymalną, zamieniamy na system dziesiątkowy i wstawiamy odpowiadający znak ASCII. Później to samo tylko, że w drugą stronę.
[code]# klucz traktujemy w ten sposób
key.to_s.scan(/…/).map { |hex| hex.to_i(16).chr }.join("")
a hmac-sha1 mielimy tak:
hmac.each_byte.map { |a| a.to_s(16) }.join("")[/code]
Czy ktoś jest mi w stanie wytłumaczyć jaki to ma sens? Bo może czegoś nie widzę.
I druga sprawa, ifirma ma jedno z gorszych API jakie do tej pory widziałem, a dokumentacja jest biedna, jedyne co nawiązuje do tego problemu, to: “HashWiadomosci powinien być zapisany w postaci heksadecymalnej.”. Rozumiem, że niektórzy lubią sobie pogrzebać w kodzie pehapa i wyczaić jak to właściwie powinno działać, ale ja znam inne sposoby na spędzanie czasu.
Dla potomnych, jakby ktoś to musiał jeszcze implementować, trochę się pomyliłem z tym co trzeba zrobić po szyfrowaniu, nie sprawdziłem jak dokładnie działa pehapowa funkcja bin2hex - to co podałem wyżej działa tylko dla niektórych przypadków, odpowiednik w ruby można uzyskać tak: https://github.com/drogus/ifirma-api/blob/master/lib/ifirma/auth_middleware.rb#L34