【发布时间】: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' 但这听起来既错误、不安全又不稳定。
感谢任何帮助或提示!
【问题讨论】:
-
刚刚找到这个:stackoverflow.com/questions/4475726/… 并会试一试。
-
我发现:github.com/plataformatec/devise/wiki/OmniAuth:-Overview .. 所以会试试这个。有很大的希望..
-
更改为与 Devise 更紧密的集成,将编辑帖子并添加更新的代码。
-
向 Devise 添加了错误报告:github.com/plataformatec/devise/issues/1065
-
那么,您从设计中删除了
session[:user]的东西,并用sign_in_and_redirect替换了吗?你使用authorize_user!在过滤器之前,以便它重定向到您来自的网址?谁在路由文件中实现了authenticate(没有它试过)?
标签: ruby-on-rails facebook ruby-on-rails-3