【发布时间】:2016-04-30 06:50:45
【问题描述】:
我发送电子邮件地址为signed cookie:
cookies.signed[:user_email] = { value: user.email, expires: 24.hours.from_now }
稍后前端将其作为 HTTP 标头发回给我:
request.headers["HTTP_USER_EMAIL"]
如何从收到的标头解密到原始电子邮件地址?我尝试了下面的行,但它产生了错误:
NoMethodError 异常:#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 身份验证不需要使用用户电子邮件地址的加密版本? 身份验证是基于电子邮件地址和令牌的组合完成的(令牌需要匹配作为令牌加密版本的摘要)。
【问题讨论】:
-
对我来说
example@example.com已经是一个原始电子邮件地址。旁注,而不是写request.headers["HTTP_USER_EMAIL"] == nil你可以使用nil?方法:request.headers["HTTP_USER_EMAIL"].nil? -
谢谢,我测试时给的值确实有问题。我将使用错误消息更新我的 OP。
-
试试
Rack::Session::Cookie::Base64::Marshal.new.decode(request.headers["HTTP_API_USER_EMAIL"]) -
谢谢,不幸的是它返回
nil(原因不是标题为nil,我检查了)。对于 cookie,我只使用cookies.signed[:email],它将解密 cookie 中的加密电子邮件地址。这里的不同之处在于代码不在 cookie 中,而是在 http 标头中。我试过request.headers.signed["HTTP_USER_EMAIL"],但也返回nil。 -
很遗憾,我无法提供帮助,因为我的主题不强:(
标签: ruby-on-rails security cookies encryption