Omniauth + Facebook失去了会话
在最近的一个项目中,Facebook User
可以使用他们的Facebook UID登录,根据文件上传或上传他们的个人专辑等来上传图片。
在development
环境中我的本地系统上的一切都很好用。 通过Facebook登录,退出,上传 – 一切都很棒。
在production
虽然我面临一个未知且难以调试的问题。 似乎每隔一段时间(实际上可以在将新的Submission
上传到系统时可重现)会话丢失,图片不会上传并且facebook用户已注销(!)。
我正在使用设计和omniauth。 Omniauth已集成到Devise中。
以下是触及Devise / Omniauth或User
所有代码。
应用程序/模型/ user.rb
class User [:facebook] def self.create_with_omniauth(auth) u = User.find_by_uid(auth["uid"]) return u unless u.nil? create! do |user| user.provider = auth["provider"] user.uid = auth["uid"] user.name = auth["user_info"]["name"] user.email = auth['user_info']['email'] end end def after_signin_path '/competition' end end
数据库包含所有需要的字段:rememberable
我希望可:rememberable
。
应用程序/控制器/用户/ omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController "Facebook" @user.update_attributes!(:current_auth_token => env["omniauth.auth"]['credentials']['token'], :last_language => I18n.locale.to_s, :updated_at => Time.now, :remember_created_at => Time.now) sign_in_and_redirect(:user, @user) else redirect_to '/competition' end end protected def after_omniauth_failure_path_for resource '/competition' end end
配置/初始化/ devise.rb
OmniAuth.config.full_host = "http://#{APP_CONFIG[:domain]}" Devise.setup do |config| config.mailer_sender = "devise@myapp.host.com" require 'devise/orm/active_record' config.stretches = 10 config.encryptor = :bcrypt config.timeout_in = 3.days config.pepper = "2a4b8b2ed9e12e553a7a542176f2ace1af62c062f3ba203a590b8b6307f33042b394922807a840004a3dcdf1c4e97ae085fe2c29654ddaeab7c60f431a8078abb" config.omniauth :facebook, APP_CONFIG[:facebook_app_id], APP_CONFIG[:facebook_app_secret], { :scope => "email,user_photos,user_photos,publish_stream,offline_access", :client_options => { :ssl => { :ca_file => "/etc/pki/tls/certs/ca-bundle.crt" } } } end
application_controller.rb中没有与auth相关的方法。
routes.rb :
有趣的部分如下:
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } match '/logout_fb' => 'start#logoutfb' authenticate :user do get '/users/connect/:network', :to => redirect("/users/auth/%{network}") end
不知何故,我无法理解validation块,根据另一篇文章应该是有帮助的..这个想法呢?
这么多理论:一个是omniauth_callbacks_controller
中的facebook
函数在用户会话omniauth_callbacks_controller
运行,因此sign_in_and_redirect不起作用。 所以我有了重定向到另一个页面的想法,比如’/ auth?uid = xxx’,但这听起来既错误,不安全又不稳定。
任何帮助或提示表示赞赏!
有点长镜头,但尝试关闭protect_from_forgery – 我遇到了一些会话消失的问题,结果certificate是这里讨论的问题https://github.com/intridea/omniauth/issues/203
在我的config / initializers / omniauth.rb中,我不得不添加以下内容:
OmniAuth.config.full_host = "http://yourdomain.com" # Or have an environment specific URL.
你正在使用设计,但你没有使用它自己的帮手。 例如,您已经定义了自己的current_user方法。 说实话,我看不出你做过的任何明显的错误,所以这只是一个绝望的提示。
你在本地使用什么样的会话商店?生产什么?
当您说“Facebook用户已注销”时,此用户仍然登录到Facebook ,但在yourapp.com上丢失了会话?
你确定user.id
永远不是nil,或者你在除了.destroy set session[:user_id]= some_nil_variable
之外的任何地方吗?
- Omniauth-Facebook回调不会在Rails可安装引擎中初始化
- 修复Rails oauth facebook x-frame-options sameorigin错误
- 使用facebook图表,fb_graph或Koala ruby gem比facebooker2好吗?
- omniauth-facebook cannnot获取电子邮件地址
- 使用Koala(Ruby)收集用户的新闻源
- 如何绕过Rails 3中的protect_from_forgery获取Facebookcanvas应用?
- 获取命令行(桌面)应用程序的Facebook身份validation令牌
- Facebook重定向url在ruby on rails上打开ssl错误
- 在ROR应用程序中使用Facebook和OAuth登录时出错