Rails 请问 Ruby-China 里的 Faye 如何防窃听的?

loveltyoic · 2014年07月08日 · 最后由 sunday35034 回复于 2014年07月08日 · 2026 次阅读

下面两段代码是我在 ruby-china 源码中看到的。 如果没理解错的话,这里由服务器端生成一个临时的 token,保证当前用户只能订阅到分配给自己的频道,假设有恶意用户想窃听其他用户的频道,但由于他没有这个 token,是找不到那个有效频道的,这个 token 就相当于秘密电台,只有当前用户和站点之间知道。 我的问题是:在客户端的 js 中,那个App.access_token是怎么获取的? 客户端

initNotificationSubscribe : () ->
  return if not App.access_token?
  faye = new Faye.Client(App.faye_client_url)
  faye.subscribe "/notifications_count/#{App.access_token}", (json) ->
    span = $("#user_notifications_count span")
    new_title = document.title.replace(/^\(\d+\) /,'')
    if json.count > 0
      span.addClass("badge-error")
      new_title = "(#{json.count}) #{new_title}"
      url = App.fixUrlDash("#{App.root_url}#{json.content_path}")
      console.log url
      $.notifier.notify("",json.title,json.content,url)
    else
      span.removeClass("badge-error")
    span.text(json.count)
    document.title = new_title
  true

服务器

def realtime_push_to_client
  if self.user
    hash = self.notify_hash
    hash[:count] = self.user.notifications.unread.count
    FayeClient.send("/notifications_count/#{self.user.temp_access_token}", hash)
  end
end

另外,这样应该算不上绝对安全吧,因为token是由下面的代码产生的

def temp_access_token
  Rails.cache.fetch("user-#{self.id}-temp_access_token-#{Time.now.strftime("%Y%m%d")}") do
    SecureRandom.hex
  end
end

有可能产生碰撞。

app/views/layouts/application.html.erb
94:      App.access_token = "<%= current_user.temp_access_token %>";

#2 楼 @alsotang 竟然没想到是通过 view 传的,感谢解答!

标题和帖子里的内容不一致嘛,防止窃听用 ssl

#4 楼 @sunday35034 我的意思是 subscribe 别人的频道,跟用不用 ssl 没关系吧。

#5 楼 @loveltyoic 好吧,不同层面的窃听

需要 登录 后方可回复, 如果你还没有账号请 注册新账号