在最近的一个项目中,facebook User可以使用他们的Facebook登录,根据文件上传或个人相册等上传图片。
在我的本地系统上,在development环境中,一切都运行得很好。通过Facebook登录,注销,上传-都很棒。
然而,在production中,我面临着一个未知且难以调试的问题。似乎每隔一段时间(当将一个新的Submission上传到系统时实际上是可复制的)会话丢失,图片没有上传,facebook用户被注销(!)。
我用的是设计和杂耍。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
endconfig/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.中没有任何与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不知何故我无法理解认证块,根据另一篇文章,这应该是有帮助的。对此也有想法吗?
有很多理论:一种是,facebook函数在omniauth_callbacks_controller中运行,而不是用户的会话,因此sign_in_and_redirect不能工作。因此,我想重定向到另一个页面,如'/auth?uid=xxx‘,但这听起来是错误的、不安全的和不稳定的。
任何帮助或提示都是非常感谢的!
发布于 2011-05-12 10:50:34
你使用的是设计,但你没有使用它自己的助手。例如,您已经定义了自己的current_user方法。老实说,我看不出你犯了什么明显的错误,所以这只是一个绝望的提示。
您在本地使用什么样的会话商店?在生产中使用什么?
当你说"facebook用户注销了“时,这个用户仍然登录到facebook,但失去了在yourapp.com的会话?
您确定user.id从未为零,或者您是否在.destroy set session[:user_id]= some_nil_variable之外的任何其他地方?
https://stackoverflow.com/questions/5816294
复制相似问题