简体   繁体   English

用于Facebook,Twitter登录的Rails 4 omniauth

[英]Rails 4 omniauth for facebook, twitter login

I am creating a rails application with facebook and twitter login, using omniauth. 我正在使用omniauth使用Facebook和Twitter登录创建Rails应用程序。 This is my code: 这是我的代码:

gemfile: 的Gemfile:

gem 'devise'
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'omniauth-linkedin'
gem 'omniauth-google-oauth2'

config/initialize/device: 配置/初始化/设备:

config.omniauth :facebook, "1487929211426782", "[FILTERED]", {:scope => 'email', :display => "popup"}
  config.omniauth :twitter, "xsVbzW2uFYv7rz4Nc0CWFHRrX", "[FILTERED]", :display => "popup"

OmniauthCallbacksController OmniauthCallbacksController

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def linkedin
    auth = env["omniauth.auth"]
    @user = User.connect_to_linkedin(request.env["omniauth.auth"],current_user)
    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.twitter_uid"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

  def facebook
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

  def twitter
    auth = env["omniauth.auth"]

    @user = User.find_for_twitter_oauth(request.env["omniauth.auth"],current_user)
    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.twitter_uid"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

end

User.rb User.rb

def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
    user = User.where(:provider => auth.provider, :uid => auth.uid).first
    if user
      return user
    else
      registered_user = User.where(:email => auth.info.email).first
      if registered_user
        return registered_user
      else
        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],
        )
      end    end
  end

  def self.find_for_twitter_oauth(auth, signed_in_resource=nil)
    user = User.where(:provider => auth.provider, :uid => auth.uid).first
    if user
      return user
    else
      registered_user = User.where(:email => auth.uid + "@twitter.com").first
      if registered_user
        return registered_user
      else

        user = User.create(name:auth.extra.raw_info.name,
                           provider:auth.provider,
                           uid:auth.uid,
                           email:auth.uid+"@twitter.com",
                           encrypted_password:Devise.friendly_token[0,20],
        )
      end

    end
  end

the view: 风景:

<div id="user-widget">
  <% if current_user %>
      Welcome <strong><%= current_user.name %></strong>!
      <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
  <% else %>
      <%= link_to "Sign in with Facebook", "/users/auth/facebook", id: "sign_in" %>
  <% end %>
</div>

Sometimes it works, other times it gives me error: 有时它可以工作,而其他时候却给我错误:

SSL_connect returned = 1 errno = 0 state = unknown state: unknown protocol 

When it does the waiting time is very long (about 10-20 seconds). 这样做的时候等待时间很长(大约10-20秒)。

I'm testing it all locally. 我正在本地进行测试。 What might this depend on? 这可能取决于什么?

Use this code in devise.rb 在devise.rb中使用此代码

config/initializers/devise.rb: 配置/初始化/ devise.rb:

require "omniauth-facebook"
config.omniauth :facebook, "App ID", "App Secret", { access_type: "offline", approval_prompt: "", :client_options => {:ssl => {:verify => false}} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM