新手问题 求用过 Devise + Omniauth 的同志们来看看,一定要把取回来的 OAuth 信息放到 session 里面然后导致 cookie 撑爆么?

howiehu · 2013年06月27日 · 最后由 Rei 回复于 2014年05月19日 · 4719 次阅读

如代码所示:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def github

    @user = User.find_for_github_oauth(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "GitHub" if is_navigational_format?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
    else
      session["devise.github_data"] = request.env["omniauth.auth"]
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "GitHub" if is_navigational_format?
      redirect_to new_user_registration_url
    end
  end
end

这一行:

...
session["devise.github_data"] = request.env["omniauth.auth"]
...

会把一个巨大无比的 github oauth 信息放到 session 中,这个直接会让 cookie overflow。

由于不想把 session 存到内存里面,请问这个有必要这样写吗?有什么解决方案没有?

存 session 是打算做什么?

#1 楼 @Rei 应该是给跳转后的注册页面使用的,防止多次从 github 验证,比如在注册页面刷新。

#1 楼 @Rei 先前看到了一种办法是只取一部分信息,但是不知道有没有更好的办法。 http://stackoverflow.com/questions/7117200/devise-for-twitter-cookie-overflow-error

Rails 的 Session 不是有多种策略嘛?既然这种方法行不通了,就换其他策略咯。

把需要的信息提出来存 session,oauth 我记得有 access_token 和 access_secret 还有不一定提供的 id 三个字符串,不至于把 cookie 撑爆。

#3 楼 @howiehu 这方法不错。

授权完毕还要补充注册信息的体验并不好。

看 rubychina 的源码里有处理

#8 楼 @i5ting 哦?去看看……

#8 楼 @i5ting 真没看明白是咋处理的……

rubychina 授权过后就直接注册了,没有补充资料这一步,不用存 session。

需要吧 env["omniauth.auth"] 里面的 extra 去掉。

session["devise.github_data"] = env["omniauth.auth"].except("extra")

删除掉就好了吧,实在不行就存数据库,定期删除就好。

#12 楼 @steven_yue #11 楼 @Rei 是删掉就好了,但是现在又有了新问题,provider 和 uid 存不进数据库,郁闷……

#14 楼 @howiehu 怎么叫存不进数据库?

#15 楼 @steven_yue 就是跳转到注册页面并注册后发现 provider 和 uid 是 nil……

#16 楼 @howiehu

你得用 override devise 的 self.new_with_session(params, session) method, 它允许传入 session 的值。

参考这里 https://github.com/plataformatec/devise/wiki/OmniAuth%3A-Overview

#17 楼 @steven_yue 原来是这样啊!!!谢谢谢谢!!!

#7 楼 @Rei

if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "GitHub" if is_navigational_format?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated

sign_in_and_redirect 登录成功后好像不能跳转,重写了 after_sign_in_path_for 函数也不行。假设第三方登录按钮在网站首页,登录成功还是在首页,怎么跳转到用户主页

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