2016-01-23 26 views
9

tôi gửi một địa chỉ email như signed cookie:Cách giải mã `.signed` khi tìm thấy giá trị được mã hóa trong tiêu đề http thay vì trong cookie?

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

Sau đó frontend gửi nó trở lại với tôi như một HTTP header:

request.headers["HTTP_USER_EMAIL"] 

Làm thế nào để sau đó giải mã từ tiêu đề nhận với bản gốc địa chỉ email? Tôi đã thử các dòng dưới đây, nhưng nó tạo ra các lỗi:

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

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

Với debugger tôi nhận được một giá trị cho request.headers["HTTP_USER_EMAIL"] của "Im9yZ29utcGxlLmNvbSI=--37ddc725d139f86095ae839012c31a14e". Vì vậy, các giá trị được mã hóa là có.

Giá trị chênh lệch trong cookie so với tiêu đề: Nếu giá trị được mã hóa được tìm thấy trong cookie, bạn có thể giải mã bằng cách sử dụng cookies.signed[:http_user_email]. Nỗ lực của tôi về số request.headers["HTTP_USER_EMAIL"].signedrequest.headers.signed["HTTP_USER_EMAIL"] về cơ bản giống như khi có cookie, bạn sẽ lấy giá trị được mã hóa của cookie và thêm .signed vào cuối: "Im9yZ29utcGxlL".signed. Và điều đó cũng không hiệu quả. Nhưng làm thế nào để làm điều đó nếu giá trị được mã hóa được tìm thấy trong một chuỗi?

Hoặc bạn có cho rằng không cần sử dụng phiên bản mã hóa địa chỉ email của người dùng để xác thực API không? Xác thực được thực hiện dựa trên sự kết hợp của địa chỉ email và mã thông báo (mã thông báo cần khớp với thông báo là phiên bản mã hóa của mã thông báo).

+0

cho tôi 'example @ example.com' đã là địa chỉ email ban đầu. Sidenote, thay vì viết 'request.headers [" HTTP_USER_EMAIL "] == nil' bạn có thể sử dụng phương thức' nil? ':' Request.headers ["HTTP_USER_EMAIL"]. Nil? ' –

+0

Cảm ơn, thực sự có một vấn đề trong giá trị tôi đã cho nó trong thử nghiệm của tôi. Tôi sẽ cập nhật OP của tôi với thông báo lỗi. – Nick

+0

thử 'Rack :: Session :: Cookie :: Base64 :: Marshal.new.decode (request.headers [" HTTP_API_USER_EMAIL "])' –

Trả lời

1

Tại config/initializers/secret_token.rb bạn nên có mật khẩu:

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

Để giải mã:

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) 

Trong 4.0 dựa trên cấu hình mặc định. Trong 4.1 trở đi, bạn có thể có config/secrets.yml thay vì secret_token.rb

1

thiết lập giá trị như cookie và truy cập nó bằng ký

như vậy trong trường hợp của bạn

mail_signed = request.headers["HTTP_USER_EMAIL"] 
cookies[:mail]=mail_signed 
mail = cookies.signed[:mail] 
Các vấn đề liên quan