设计Omniauth-Facebook值得记住

时间:2017-02-16 17:17:40

标签: ruby-on-rails devise ruby-on-rails-5 omniauth-facebook

问题

我有设计Omniauth-Facebook 身份验证。使用facebook登录有效,但当用户转到localhost:3000时会话丢失。 我有以下 GEM

Devise 4.2.0
Rails 5
omniauth 1.4.0
omniauth-facebook 4.0.0
omniauth-oauth2 1.4.0

描述

会话适用于未通过Omniauth-Facebook验证的用户,

这是我的devise.rb omniauth-facebook 设置

config.omniauth :facebook, "APP_ID", "APP_SECRET", callback_url: "http://127.0.0.1:3000/users/auth/facebook/callback", scope: 'public_profile, email', image_size: 'large', provider_ignores_state: true 

我已经尝试过以下不起作用的解决方案:

  1. 关闭protect_from_forgery
  2. OmniAuth.config.full_host =" http://127.0.0.1:3000"
  3. 遵循Jeroen van Dijk在以下帖子中接受的解决方案: Devise and OmniAuth remembering OAuth 对于此解决方案,在我的rake路由中,即使我在user_oauth_connect_path中添加了路由,我也没有路径routes.rb。我也认为这不是我的问题的解决方案,因为我有Devise 4.2.0和Rails 5
  4. @ user.remember_me = true
  5. 之前的所有解决方案均来自以下stackoverflow讨论:

    Omniauth+Facebook lost session

    Devise and OmniAuth remembering OAuth

    代码是 Devise omniauth-facebook 的github指南中包含的标准代码 非常感谢你的帮助 Fabrizio Bertoglio

1 个答案:

答案 0 :(得分:0)

也许这是我问题的解决方案? Facebook登录现在正常工作,如果没有存储会话,用户可以再次登录而不会出现问题。我没有任何关于失去会议的经验,所以我对这个问题没有太大的兴趣。

  

请注意,Devise的RegistrationsController默认在构建资源之前调用User.new_with_session。这意味着,如果我们需要在注册前初始化用户时从会话中复制数据,我们只需要在模型中实现new_with_session。以下是复制Facebook电子邮件的示例:

class User < ApplicationRecord
  def self.new_with_session(params, session)
    super.tap do |user|
      if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
        user.email = data["email"] if user.email.blank?
      end
    end
  end
end
  

最后,如果您想允许用户取消使用Facebook注册,您可以将其重定向到cancel_user_registration_path。这将删除以devise开头的所有会话数据。并且将不再调用上面的new_with_session挂钩。

Omniauth Facebook Gihub page