Tuesday, 15 October 2019

Social login facebook,twitter ..

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'

2. Model generate:

   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

4. User.rb
      # before_create :confirmation_token
       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,      
           244615150400-05thnta81fhg631up71t8v7e167i8pta.apps.googleusercontent.com',   'XW9LFZYGtLjruVh9kOpmCaRY'
        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]

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

  Common Git Commands   Take clone of a repository git clone <remote-repository-url> ex: git clone  https://github.com/agricor/RegTech...