[英]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.