我发送的电子邮件地址为signed Cookie:
cookies.signed[:user_email] = { value: user.email, expires: 24.hours.from_now }
稍后,前端将其作为HTTP标头发送给我:
request.headers["HTTP_USER_EMAIL"]
如何从收到的标头解密到原始电子邮件地址?我尝试了下面这一行,但它产生错误:
NoMethodError异常:未定义的方法`signed'对于#String:0x00000008a57a78
email = request.headers["HTTP_USER_EMAIL"].signed unless (request.headers["HTTP_USER_EMAIL"] == nil)
使用debugger
,我获得request.headers["HTTP_USER_EMAIL"]
"Im9yZ29utcGxlLmNvbSI=--37ddc725d139f86095ae839012c31a14e"
的值。所以加密值就在那里。
Cookie与标头的差异值如果在Cookie中找到加密值,则可以使用cookies.signed[:http_user_email]
对其进行解密。我对request.headers["HTTP_USER_EMAIL"].signed
和request.headers.signed["HTTP_USER_EMAIL"]
的尝试与使用Cookie时的尝试基本相同,您将获取Cookie的加密值并在末尾添加.signed:"Im9yZ29utcGxlL".signed
。那也不会奏效。但是,如果在字符串中找到加密值,该如何做呢?
或者您是否认为不需要使用用户电子邮件地址的加密版本进行API身份验证?根据电子邮件地址的组合进行身份验证和令牌(令牌需要匹配摘要,该摘要是令牌的加密版本)。
答案 0 :(得分:1)
将值设置为cookie并使用签名
访问它所以在你的情况下
mail_signed = request.headers["HTTP_USER_EMAIL"]
cookies[:mail]=mail_signed
mail = cookies.signed[:mail]
答案 1 :(得分:1)
在config/initializers/secret_token.rb
,你应该有密码:
Demo::Application.config.secret_key_base = 'b14e9b5b720f84fe02307ed16bc1a32ce6f089e10f7948422ccf3349d8ab586869c11958c70f46ab4cfd51f0d41043b7b249a74df7d53c7375d50f187750a0f5'
要解密:
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)
4.0基于默认配置。 在4.1之后,您可以使用config/secrets.yml而不是secret_token.rb