【问题标题】:Omniauth+Facebook lost sessionOmniauth+Facebook 丢失会话
【发布时间】:2011-04-28 09:14:02
【问题描述】:

在最近的一个项目中,facebookUsers 可以使用他们的 Facebook UID 登录,以上传基于文件上传或个人相册上传等的图片提交。

development 环境中,我的本地系统上一切正常。通过 Facebook 登录、注销、上传 - 都很棒。

production 中,虽然我面临一个未知且难以调试的问题。似乎每隔一段时间(实际上可以在将新的Submission 上传到系统时重现)会话丢失,图片未上传并且 Facebook 用户已注销(!)。

我正在使用设计和omniauth。 Omniauth 已集成到设计中。

以下是涉及 Devise/Omniauth 或 User 的所有代码。

app/models/user.rb

class User < ActiveRecord::Base
  devise :omniauthable, :rememberable, :omniauth_providers => [: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 所需的所有字段。

app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    # You need to implement the method below in your model
    @user = User.create_with_omniauth(env["omniauth.auth"])

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "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

config/initializers/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 中没有与身份验证相关的方法。

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

不知何故,我无法理解身份验证块,根据另一篇文章,这应该会有所帮助.. 对此也有想法吗?

这么多理论: 一是omniauth_callbacks_controller 中的facebook 函数在用户会话之外运行,因此sign_in_and_redirect 不起作用。所以我有重定向到另一个页面的想法,比如 '/auth?uid=xxx' 但这听起来既错误、不安全又不稳定。

感谢任何帮助或提示!

【问题讨论】:

标签: ruby-on-rails facebook ruby-on-rails-3


【解决方案1】:

有点长镜头,但请尝试关闭protect_from_forgery - 我遇到了一些会话消失的问题,结果证明这是https://github.com/intridea/omniauth/issues/203此处讨论的问题

【讨论】:

  • 这就是错误所在。事实上,我已经(愚蠢地)缓存了一些与此相关的东西。你的回答是一个很好的提示。谢谢。
【解决方案2】:

在我的 config/initializers/omniauth.rb 中,我必须添加以下内容:

OmniAuth.config.full_host = "http://yourdomain.com" # Or have an environment specific URL.

【讨论】:

  • 添加了这个,但没有成功。感谢您的帮助。
【解决方案3】:

您正在使用设计,但您没有使用它自己的助手。例如,您已经定义了自己的 current_user 方法。老实说,我看不出你犯了什么明显的错误,所以这只是一个绝望的提示。

您在本地使用什么类型的会话存储,在生产中使用什么?

当您说“facebook 用户已注销”时,该用户仍然登录到 facebook,但在 yourapp.com 上失去了会话?

您确定user.id 永远不会为零,或者您确定在.destroy 集合session[:user_id]= some_nil_variable 之外的任何其他位置?

【讨论】:

  • 实际上,我根本没有为 User 对象使用设计。这是一个很好的提示,我将尝试启用它,从而让 Devise 实现这些方法。会话存储:Rails 3 中定义的默认存储。注销:是的,已注销我的应用程序 - 控制器将收到一个 current_user。
  • 会话存储是:./config/initializers/session_store.rb:14: MyApp::Application.config.session_store :cookie_store, :key => '_my_app_production_session'
  • 应该没问题,出于安全原因我不推荐cookie_store,但它应该与这个问题无关。不小心分配了session[:user]= nil_result怎么办,你排除了这种可能吗?
  • 其实是的,排除了。 SessionController#create 函数是唯一一个设置 session[:user_id] 的函数(#destroy 函数除外)。 (为它感到高兴)。我正在继续检查是否有隐藏的调用,但无法想象。日志也不包含类似的内容。
猜你喜欢
  • 2011-11-04
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2013-08-10
  • 2012-05-09
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多