在为http://meejian.comdevise和omniauth做微博登录时,犯了一个错误,这里分享一下:用
有时候,你需要将 omniauth 返回的 env["omniauth.auth"] 的信息记录下来,然后在用户真正注册的时候把这些信息填充进去,这样用户就不用再填写一些头像姓名之类的信息了
可以使用 session 记录,然后在 user model 里重载 devise 提供的new_with_session
方法:
class << self
def new_with_session(params, session)
super.tap do |user|
if data = session["devise.omniauth"]
user.merge_from_omniauth! data
end
end
end
end
def merge_from_omniauth!(data)
auths << Auth.from_omniauth(data)
self.name ||= data[:info][:name]
self.location = data[:info][:location]
self.description = data[:info][:description]
self.remote_avatar_url = data[:info][:image]
end
但是,如果把env["omniauth.auth"]
的信息全部记录到session["devise.omniauth"]
中,只要是新浪微博做 provider,那么就会出现ActionDispatch::Cookies::CookieOverflow
的错误
原因是微博返回的信息中有一个:extra
字段,它相当地大,所以造成了 cookie 的溢出 (因为 cookie 只能存有限的数据,通常浏览器是 4k)
解决方法有两个:
session["devise.omniauth"] = request.env["omniauth.auth"].except(:extra)
顺带一提,除了微博,twitter 的 oauth 返回数据也有这个很大的:extra 字段