Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Devise Omniauth + Linkedin Error. "Not found. Authentication passthru"

I followed the instructions exactly as in http://sourcey.com/rails-4-omniauth-using-devise-with-twitter-facebook-and-linkedin/#changes

To implement Devise Omniauth Linkedin in my app, I did the following,

In devise.rb

config.omniauth :linked_in, "*******", "**********"

And in my user model which is user.rb , I had this

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :lockable, :confirmable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable

TEMP_EMAIL_PREFIX = 'change@me'
TEMP_EMAIL_REGEX = /\Achange@me/
validates_format_of :email, :without => TEMP_EMAIL_REGEX, on: :update

def self.find_for_oauth(auth, signed_in_resource = nil)

# Get the identity and user if they exist
identity = Identity.find_for_oauth(auth)

# If a signed_in_resource is provided it always overrides the existing user
# to prevent the identity being locked with accidentally created accounts.
# Note that this may leave zombie accounts (with no associated identity) which
# can be cleaned up at a later date.
user = signed_in_resource ? signed_in_resource : identity.user

# Create the user if needed
if user.nil?

  # Get the existing user by email if the provider gives us a verified email.
  # If no verified email was provided we assign a temporary email and ask the
  # user to verify it on the next step via UsersController.finish_signup
  email_is_verified = auth.info.email && (auth.info.verified || auth.info.verified_email)
  email = auth.info.email if email_is_verified
  user = User.where(:email => email).first if email

  # Create the user if it's a new registration
  if user.nil?
    user = User.new(
      name: auth.extra.raw_info.name,
      #username: auth.info.nickname || auth.uid,
      email: email ? email : "#{TEMP_EMAIL_PREFIX}-#{auth.uid}-#{auth.provider}.com",
      password: Devise.friendly_token[0,20]
    )
    user.skip_confirmation!
    user.save!
  end
end

# Associate the identity with the user if needed
if identity.user != user
  identity.user = user
  identity.save!
end
user
 end

 def email_verified?
self.email && self.email !~ TEMP_EMAIL_REGEX
end

 end

My routes.db file looks like this

devise_for :users, :controllers => { omniauth_callbacks: 'omniauth_callbacks' }
match '/users/:id/finish_signup' => 'users#finish_signup', via: [:get, :patch], :as => :finish_signup

controllers/omniauth_callbacks_controller.rb

   class OmniauthCallbacksController < Devise::OmniauthCallbacksController
      def self.provides_callback_for(provider)
      class_eval %Q{
      def #{provider}
      @user = User.find_for_oauth(env["omniauth.auth"], current_user)

     if @user.persisted?
       sign_in_and_redirect @user, event: :authentication
      set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format?
    else
      session["devise.#{provider}_data"] = env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
}
 end

[:linked_in].each do |provider|
provides_callback_for provider
end

def after_sign_in_path_for(resource)
if resource.email_verified?
  super resource
else
  finish_signup_path(resource)
end
end
def linkedin
# You need to implement the method below in your model (e.g. app/models/user.rb)
@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 action_missing(provider)
# Set up authentication/authorizations here, and distribute tasks
# that are provider specific to other methods, leaving only tasks
# that work across all providers in this method. 
end
end

When I click on the link to sign in with Linkedin the below error appears:

Not found. Authentication passthru.

Please help me.I don't undeerstand what is wrong, tried time and again but same error appears, Thank you!

like image 549
Ilothco Beopcastev Avatar asked Dec 02 '14 11:12

Ilothco Beopcastev


1 Answers

This problem is due to the url that is requesting http://localhost:3000/users/auth/linked_in/ instead of http://localhost:3000/users/auth/linkedin/

To fix this you need to change in your app/config/initializers/devise.rb this:

config.omniauth :linked_in, LINKEDIN_CONFIG['APP_KEY'], LINKEDIN_CONFIG['APP_SECRET']

by this:

config.omniauth :linkedin, LINKEDIN_CONFIG['APP_KEY'], LINKEDIN_CONFIG['APP_SECRET']
like image 60
juliangonzalez Avatar answered Sep 21 '22 00:09

juliangonzalez