Devise Omniauth + Linkedin Error. "Not found. Authentication passthru"
devise, linkedin-api, omniauth, ruby-on-rails
Solution
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']
Problem
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!