Question

I'm using oauth to try and login through venmo based on this guide. This isn't official and venmo docs don't even show code example with ruby.

At first, I couldn't even see the venmo login. I removed the ENV and brackets around the id and secret in the initializer and then I could see the login. When I submit and it hits the call back I get this error: (and I think it retries endlessly...I have to manually shut down server)

{"error": {"message": "Missing argument: client_id.", "code": 241}}
I, [2014-04-16T11:49:48.124423 #47700]  INFO -- omniauth: (venmo) Callback phase initiated.
E, [2014-04-16T11:49:48.345202 #47700] ERROR -- omniauth: (venmo) Authentication failure!       invalid_credentials: OAuth2::Error, {"message"=>"Missing argument: client_id.", "code"=>241}: 

Here is my route:

get 'users/auth/venmo/callback' => 'omniauth_callbacks_controller#create'

Gems:

gem 'devise'
gem 'omniauth'
gem 'omniauth-venmo'

I have this in my initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
   provider :venmo, 'id', 'secret', :scope => 'access_feed,access_profile,access_friends,make_payments'   
end

This is my callback controller

class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def venmo
    @user = User.find_for_oauth(env["omniauth.auth"], current_user)
    raise
    if @user.persisted?
        sign_in_and_redirect root_path, :event => :authentication
        set_flash_message(:notice, :success, :kind => "Venmo") if is_navigational_format?
    else
        session["devise.venmo_uid"] = env["omniauth.auth"]
        redirect_to new_user_registration_url
    end
end

protected

def auth_hash
    request.env['omniauth.auth']
end 

end

and I have initializers/devise.rb

   require 'omniauth-venmo'
   config.omniauth :venmo, "KEY", "SECRET"

-- with the values filled in of course. I would appreciate the help... Thank you!!

UPDATE: I've pushed this to a github repository and one of my peers pulled it. He did not get the same error. What would the reason for this be..? here is the output

Was it helpful?

Solution

@Peege151... I created a working solution with devise integration as said by you..here is my code below, use it for reference purpose. I don't say this is the exact solution for the raised question but this may help since i got it working

Gems:

gem 'rails 3.2.14' # Important~
gem 'devise'
gem 'omniauth'
gem 'omniauth-venmo'

I have not created omniauth.rb in initializers .... instead i added configuration in devise.rb as u wanted it with devise

my devise.rb :

require "omniauth-venmo"
config.omniauth :venmo, '--Your APP KEY -- ', '-- App Secret--',{:client_options => {:ssl => {:verify => false}}}

above line i have set SSL verification to false,, if u want enable SSL with (:verify => true).

This is my callback controller code:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def venmo 
   @user = User.find_for_oauth(request.env["omniauth.auth"], current_user) 
   if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication 
     set_flash_message(:notice, :success, :kind => "Venmo") if is_navigational_format? 
   else 
     session["devise.twitter_uid"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url
   end
  end  
end

User.rb code:

class User < ActiveRecord::Base
  TEMP_EMAIL = 'change@me.com'
  TEMP_EMAIL_REGEX = /change@me.com/ 
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :provider , :uid 
  devise :omniauthable

  def self.find_for_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.blank? ? TEMP_EMAIL : auth.info.email,
                          password:Devise.friendly_token[0,20],
                        )        
         end          
      end
      user
    end
  end

Here is my for devise and callback routes.rb:

 devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
 get '/auth/venmo/callback' => 'users/omniauth_callbacks#venmo'

login page link:

<%= link_to "Sign in with Venmo", user_omniauth_authorize_path(:venmo) %> 

screenshot:

enter image description here

OTHER TIPS

I'm not sure the exact issue here, but one thing to be cognizant of is it looks you're hitting a naked URL instead of api.venmo.com/v1/, which is our latest version. Try that first, Then we can work from there.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top