2016-01-23 20 views
9

wyślę adres e-mail jako signed cookie:Jak odszyfrować `.signed`, gdy zaszyfrowana wartość znajduje się w nagłówku http zamiast w pliku cookie?

cookies.signed[:user_email] = { value: user.email, expires: 24.hours.from_now } 

Później frontend wysyła go z powrotem do mnie jako nagłówka HTTP:

request.headers["HTTP_USER_EMAIL"] 

Jak następnie odszyfrować z odebranego nagłówka do oryginału adres e-mail? Próbowałem wiersz poniżej, ale to powoduje błąd:

NoMethodError Exception: undefined method `signed' for #String:0x00000008a57a78

email = request.headers["HTTP_USER_EMAIL"].signed unless (request.headers["HTTP_USER_EMAIL"] == nil) 

Z debugger uzyskać wartość request.headers["HTTP_USER_EMAIL"] z "Im9yZ29utcGxlLmNvbSI=--37ddc725d139f86095ae839012c31a14e". Tak więc jest zaszyfrowana wartość.

Wartość różnicy w pliku cookie w porównaniu z nagłówkiem: Jeśli zaszyfrowana wartość zostanie znaleziona w pliku cookie, można ją odszyfrować, używając cookies.signed[:http_user_email]. Moje próby request.headers["HTTP_USER_EMAIL"].signed i request.headers.signed["HTTP_USER_EMAIL"] są zasadniczo takie same, jak w przypadku plików cookie, które można wziąć zaszyfrowaną wartość pliku cookie i dodać .signed na końcu: "Im9yZ29utcGxlL".signed. I to też nie działa. Ale jak to zrobić, jeśli zaszyfrowana wartość znajduje się w ciągu znaków?

Czy uważasz, że nie ma potrzeby używania zaszyfrowanej wersji adresu e-mail użytkownika do uwierzytelniania API? Uwierzytelnianie odbywa się na podstawie kombinacji adresu e-mail i tokena (token musi pasować do skrótu, który jest zaszyfrowaną wersją tokena).

+0

dla mnie 'example @ example.com' jest już oryginalnym adresem e-mail. Sidenote, zamiast pisać 'request.headers [" HTTP_USER_EMAIL "] == nil' możesz użyć' nil? 'Method:' request.headers ["HTTP_USER_EMAIL"]. Nil? ' –

+0

Dzięki, rzeczywiście istniał problem w wartość dałem to w moim teście. Zaktualizuję mój OP komunikatem o błędzie. – Nick

+0

wypróbuj 'Rack :: Session :: Cookie :: Base64 :: Marshal.new.decode (request.headers [" HTTP_API_USER_EMAIL "])' –

Odpowiedz

1

Na config/initializers/secret_token.rb trzeba mieć hasło:

Demo::Application.config.secret_key_base = 'b14e9b5b720f84fe02307ed16bc1a32ce6f089e10f7948422ccf3349d8ab586869c11958c70f46ab4cfd51f0d41043b7b249a74df7d53c7375d50f187750a0f5' 

Aby odszyfrować:

content = request.headers["HTTP_USER_EMAIL"] 
unescaped_content = URI.unescape(content) 

crypt = ActiveSupport::MessageEncryptor.new(Rails.configuration.secret_key_base) 
data = crypt.decrypt_and_verify(unescaped_content) 

W 4.0 na podstawie domyślnej konfiguracji. W wersji 4.1 możesz mieć config/secrets.yml zamiast secret_token.rb

1

ustawić wartość jak ciasteczka i do niego dostęp z podpisanej

więc w Twoim przypadku

mail_signed = request.headers["HTTP_USER_EMAIL"] 
cookies[:mail]=mail_signed 
mail = cookies.signed[:mail]