Pregunta

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

¿Fue útil?

Solución

@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

Otros consejos

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top