首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Omniauth+Facebook丢失会话

Omniauth+Facebook丢失会话
EN

Stack Overflow用户
提问于 2011-04-28 09:14:02
回答 3查看 3K关注 0票数 7

在最近的一个项目中,facebook User可以使用他们的Facebook登录,根据文件上传或个人相册等上传图片。

在我的本地系统上,在development环境中,一切都运行得很好。通过Facebook登录,注销,上传-都很棒。

然而,在production中,我面临着一个未知且难以调试的问题。似乎每隔一段时间(当将一个新的Submission上传到系统时实际上是可复制的)会话丢失,图片没有上传,facebook用户被注销(!)。

我用的是设计和杂耍。Omniauth被纳入设计。

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

app/models/user.rb

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

有趣的部分如下:

代码语言:javascript
运行
复制
  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

不知何故我无法理解认证块,根据另一篇文章,这应该是有帮助的。对此也有想法吗?

有很多理论:一种是,facebook函数在omniauth_callbacks_controller中运行,而不是用户的会话,因此sign_in_and_redirect不能工作。因此,我想重定向到另一个页面,如'/auth?uid=xxx‘,但这听起来是错误的、不安全的和不稳定的。

任何帮助或提示都是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-25 23:31:56

有点渺茫,但试着关闭protect_from_forgery --我遇到了一些问题,会话消失了,结果就是这里讨论的问题,https://github.com/intridea/omniauth/issues/203

票数 5
EN

Stack Overflow用户

发布于 2011-05-12 10:46:20

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

代码语言:javascript
运行
复制
OmniAuth.config.full_host = "http://yourdomain.com" # Or have an environment specific URL.
票数 1
EN

Stack Overflow用户

发布于 2011-05-12 10:50:34

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

您在本地使用什么样的会话商店?在生产中使用什么?

当你说"facebook用户注销了“时,这个用户仍然登录到facebook,但失去了在yourapp.com的会话?

您确定user.id从未为零,或者您是否在.destroy set session[:user_id]= some_nil_variable之外的任何其他地方?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5816294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档