Social Login fb/twitter/linkedin
1. Gemfile:-
gem "oauth"
gem "oauth2"
gem 'omniauth-oauth2'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'
gem 'omniauth-linkedin'
gem 'omniauth-github'
gem 'omniauth-pinterest'
gem "oauth2"
gem 'omniauth-oauth2'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'
gem 'omniauth-linkedin'
gem 'omniauth-github'
gem 'omniauth-pinterest'
2. Model generate:
rails g model authentication provider:string uid:string user_id:integer
rails g model authentication provider:string uid:string user_id:integer
token:text token_expired_at:datetime
3. app/model/authentication.rb:
class Authentication < ActiveRecord::Base
belongs_to :user
# validates :provider, :uid, :presence => true
def self.from_omniauth(auth)
if auth[:provider] == "twitter"
email = auth[:info][:nickname] + '@' + 'gmail.com'
end
if auth[:provider] == "linkedin"
email = auth.extra.raw_info.requestId.to_s+"@gmail.com"
else
email = auth[:email].present? ? auth[:email] : auth[:info][:email]
end
if auth[:provider] == "instagram"
email = auth[:info][:nickname] + '@' + 'gmail.com'
end
authenticate = where(provider: auth[:provider], :uid=>auth[:uid]).first_or_initialize
if authenticate.user
authenticate.provider = auth[:provider]
authenticate.uid =auth[:uid]
else
if auth['provider'].downcase == "facebook"
email = auth[:email].present? ? auth[:email] : auth[:uid].to_s+"@facebook.com"
elsif auth['provider'].downcase == "google"
email = auth[:email].present? ? auth[:email] : auth[:uid].to_s+"@google.com"
end
user = User.find_or_initialize_by(:email => email)
authenticate.provider = auth[:provider]
authenticate.uid = auth[:uid]
user.email = email
user.save(validate: false)
authenticate.user_id = user.id
end
authenticate.save
authenticate.user
end
end
belongs_to :user
# validates :provider, :uid, :presence => true
def self.from_omniauth(auth)
if auth[:provider] == "twitter"
email = auth[:info][:nickname] + '@' + 'gmail.com'
end
if auth[:provider] == "linkedin"
email = auth.extra.raw_info.requestId.to_s+"@gmail.com"
else
email = auth[:email].present? ? auth[:email] : auth[:info][:email]
end
if auth[:provider] == "instagram"
email = auth[:info][:nickname] + '@' + 'gmail.com'
end
authenticate = where(provider: auth[:provider], :uid=>auth[:uid]).first_or_initialize
if authenticate.user
authenticate.provider = auth[:provider]
authenticate.uid =auth[:uid]
else
if auth['provider'].downcase == "facebook"
email = auth[:email].present? ? auth[:email] : auth[:uid].to_s+"@facebook.com"
elsif auth['provider'].downcase == "google"
email = auth[:email].present? ? auth[:email] : auth[:uid].to_s+"@google.com"
end
user = User.find_or_initialize_by(:email => email)
authenticate.provider = auth[:provider]
authenticate.uid = auth[:uid]
user.email = email
user.save(validate: false)
authenticate.user_id = user.id
end
authenticate.save
authenticate.user
end
end
4. User.rb
# before_create :confirmation_token
has_many :authentications, dependent: :destroy
validates :email, :uniqueness => {:allow_blank => true}
has_many :authentications, dependent: :destroy
validates :email, :uniqueness => {:allow_blank => true}
5. Config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, '433592010474964',
'547da79dec038a932f4c846986398f63'
provider :linkedin, '81q662zzjusm67', 'xZyEHlGAaZI8Gm9q'
provider :google_oauth2,
provider :linkedin, '81q662zzjusm67', 'xZyEHlGAaZI8Gm9q'
provider :google_oauth2,
244615150400-05thnta81fhg631up71t8v7e167i8pta.apps.googleusercontent.com', 'XW9LFZYGtLjruVh9kOpmCaRY'
provider :twitter, 'y6kILe3VwuGpaFIIfPXdnv8pw',
provider :twitter, 'y6kILe3VwuGpaFIIfPXdnv8pw',
'Gb76xJS6ZvTrzzxp0jNFLnZG2nNhNaaNPfx5FAWLrL5y11e14D'
end
6. routes.rb
match '/auth/:provider/callback', :to => 'sessions#create', via: [:get, :post]
match '/auth/failure', :to => 'sessions#failure', via: [:get, :post]
match '/auth/failure', :to => 'sessions#failure', via: [:get, :post]
7. app/controller/sessions_controller.rb
class SessionsController < ApplicationController
# skip_before_action :authenticate_user!
def create
user = Authentication.from_omniauth(request.env["omniauth.auth"])
if user
flash[:notice] = "Authentication successful."
sign_in(user)
sign_in_and_redirect(user)
else
flash[:notice] = "Authentication Failed."
end
end
end
8. Add links
<li><a href="/auth/facebook" class="icoFacebook ib"
title="Facebook"><i class="fa
fa-facebook"></i></a></li>
<li><a href="/auth/twitter" class="icoTwitter ib"
title="Twitter"><i class="fa
fa-twitter"></i></a></li>
<li><a href="/auth/google_oauth2"
class="icoGoogle ib" title="Google +"><i class="fa
fa-google-plus"></i></a></li>
<li><a href="/auth/linkedin" class="icoLinkedin
ib" title="Linkedin"><i class="fa
fa-linkedin"></i></a></li>
Start server in https mode for facebook login
Step 1:- Gemfile
group :development do
gem 'thin'
end
Step 2: bundle install
Step 3: Start server ( thin start --ssl )
Step 4: https://localhost:3000
No comments:
Post a Comment