5

当我尝试在我的网站上使用 twitter 登录时,我遇到了一些错误。

ActionDispatch::Cookies::CookieOverflow in Users::OmniauthCallbacksController#twitter 

ActionDispatch::Cookies::CookieOverflow

我找不到解决方案,这是我使用的代码。

omn​​iauth_callbacks_controller.rb

def twitter
@user = User.find_for_provider_oauth(request.env["omniauth.auth"], current_user)

if @user.persisted?
  sign_in_and_redirect @user, :event => :authentication
  set_flash_message(:notice, :success, :kind => "twitter") if is_navigational_format?
else
  session["devise.twitter_data"] = request.env["omniauth.auth"]
  redirect_to new_user_registration_url
end

设计.rb

require "omniauth-twitter"


config.omniauth :twitter, 'xxxxxxx', 'xxxxxxxxxxxk', :strategy_class => OmniAuth::Strategies::Twitter

用户.rb

def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
  user.provider = auth.provider
  user.uid = auth.uid
  user.name = auth.info.name
  user.oauth_token = auth.credentials.token
  user.oauth_expires_at = Time.at(auth.credentials.expires_at)
  user.save!
end

def self.find_for_provider_oauth(auth, signed_in_resource=nil)
user = User.where(:provider => auth.provider, :uid => auth.uid).first
unless user
  user = User.create(name:auth.extra.raw_info.name,
                     provider:auth.provider,
                     uid:auth.uid,
                     email:auth.info.email,
                     password:Devise.friendly_token[0,20],
                     invite_code:"42TXP"
                     )
end
user
4

3 回答 3

9

利用:.except("extra")

session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra")

cookie它从根本不需要的部分中删除了很大一部分。

于 2015-05-16T14:27:37.860 回答
6

这是您在保存的 else 部分中放入会话的内容

session["devise.twitter_data"] = request.env["omniauth.auth"]

对于饼干来说,它可能太大了。您应该将该信息保存在其他地方。或者不要保留它。

于 2013-06-27T13:56:41.573 回答
1

我最近在遵循https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview中的方法后遇到了类似的问题,希望对您有所帮助。

在 OmniauthCallbacksController 中,而不是:

@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

我用:

@user = User.find_for_facebook_oauth(request.env["omniauth.auth"].provider, request.env["omniauth.auth"].uid, request.env["omniauth.auth"].extra.raw_info.name, request.env["omniauth.auth"].info.email, current_user)

在用户模型中:

def self.find_for_facebook_oauth(provider, uid, name, email, signed_in_resource=nil)
user = User.where(:provider => provider, :uid => uid).first
unless user
    user = User.create(:name => name,
                     :provider => provider,
                     :uid => uid,
                     :email => email,
                     :password => Devise.friendly_token[0,20]
                     )

  end
  return user
end

同样在 OmniauthCallbacksController 中确保避免使用 request.env["omniauth.auth"],而是使用 request.env["omniauth.auth"].uid。

于 2013-06-28T10:03:25.640 回答