In previous post, we went through the process to create a Provider with Oauth-plugin that works with Mongodb using mongid as the driver. Here we will build the Consumer using mongoid too.
This Consumer app will run on port 4000 (rails s -p 4000) and connect with the Provider app which will be running on port 3000.
Step 1 – step 3
Exactly the same as in previous post for Provider
4. Generates things
rails g devise:install
rails g devise User
rails g controller Welcome index
rails g oath_consumer User
rm public/index.html
Add this to your User model:
references_many :consumer_tokens
index "consumer_tokens.token"
In app/model/consumer_token.rb, find the line reads
embedded_in :user, :inverse_of => :consumer_tokens
change it to
referenced_in :user, :inverse_of => :consumer_tokens
In oauth_consumers_controller.rb, comment out the line reads
before_filter :login_required, :only=>:index
Uncomment/add new line that reads
before_filter :authenticate_user!, :only=>:index
In oauth_consumers_controller.rb, make sure these methods are NOT commented out:
go_back,logged_in?,current_user=,deny_access!
Added this to User model:
references_one :test, :class_name => "TestToken", :dependent => :destroy
(TestToken is the model for the provider, we would have TwitterToken, FacebookToken…etc)
Create a model file named test_token.rb in app/models/ with the content:
class TestToken < ConsumerToken
TEST_SETTINGS = {
:site => 'http://localhost:3000', # this is the URL to provider app
:request_token_path => '/oauth/request_token',
:access_token_path => '/oauth/access_token',
:authorize_path => '/oauth/authorize'
}
def self.consumer(options={})
@consumer ||= OAuth::Consumer.new(credentials[:key], credentials[:secret], TEST_SETTINGS.merge(options))
end
end
In config/routes.rb, add your root path root :to => "welcome#index"
5. Communicate with the Provider
Let’s start provider app on port 3000 and consumer app running on port 4000 (rails s -p 4000)
Navigate to http://localhost:3000/users/sign_up to register an account.
Navigate to http://localhost:3000/oauth_clients/ to register your app with these info:
Name: Test consumer
Main Application URL: http://localhost:4000/
Callback URL: http://localhost:4000/oauth_consumers/test/callback
You will be redirected to oauth_client show page with credentials (yours will be different)
Consumer Key: d8KBiaD98Mnp2vyB9A8ZSAT0vpKu5kdFtAXUsZup
Consumer Secret: UDdD5HAefrRZ1afguDy0WrTALYwZ8KXWKgLiSJCE
Request Token URL http://localhost:3000/oauth/request_token
Access Token URL http://localhost:3000/oauth/access_token
Authorize URL http://localhost:3000/oauth/authorize
In config/initializers/oauth_consumers.rb, add the credentials above. The content will look like:
OAUTH_CREDENTIALS = {
:test => {
:key => 'd8KBiaD98Mnp2vyB9A8ZSAT0vpKu5kdFtAXUsZup',
:secret => 'UDdD5HAefrRZ1afguDy0WrTALYwZ8KXWKgLiSJCE',
:expose => true
}
}
Restart your Consumer app if it was running when you changed the content of this initializer.
Modify the content of Welcome#index to get the provider data:
class WelcomeController < ApplicationController
def index
@consumer_tokens = TestToken.where(:user_id => current_user.id)
@token = @consumer_tokens.first.client
logger.info 'private data' + @token.get('/data/index').body
end
end
Go to http://localhost:4000/oauth_consumers to see all the services. Actually we have only 1 here, it’s the ‘test’ service which owned by ‘TestToken’ model.
Click on the service (here is test) then give it access
Go to http://localhost:4000 and you will see the data from provider printed out in log console
You can find the source code for Consumer here
