omniauth-force 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in omniauth-force.gemspec
4
+ gemspec
5
+
6
+ gem 'activesupport'
7
+ gem 'i18n'
8
+ gem 'rack-test', :require => 'rack/test'
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << %w{test lib}
8
+ t.pattern = "test/**/*_test.rb"
9
+ t.verbose = true
10
+ end
@@ -0,0 +1,16 @@
1
+ require 'oauth2/client'
2
+
3
+ # Monkey patch to correct status handling
4
+ class OAuth2::Client
5
+ alias :old_request :request
6
+ def request(verb, url, params = {}, headers = {})
7
+ old_request(verb, url, params, headers)
8
+ rescue OAuth2::HTTPError => e
9
+ if e.response.status == 302
10
+ url = e.response.headers['location']
11
+ retry
12
+ else
13
+ raise e
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,85 @@
1
+ require 'omniauth/oauth'
2
+ require 'multi_json'
3
+
4
+ module OmniAuth
5
+ module Strategies
6
+ # Authenticate to force.com utilizing OAuth 2.0 and retrieve
7
+ # basic user information.
8
+ #
9
+ # @example Basic Usage
10
+ # use OmniAuth::Strategies::Force, 'consumer_key', 'consumer_secret'
11
+ class Force < OAuth2
12
+ # @param [Rack Application] app standard middleware application parameter
13
+ # @param [String] app_id the application id
14
+ # @param [String] app_secret the application secret
15
+ def initialize(app, consumer_key, consumer_secret, options = {})
16
+ options[:site] = 'https://login.salesforce.com/'
17
+ options[:authorize_path] = '/services/oauth2/authorize'
18
+ options[:access_token_path] = '/services/oauth2/token'
19
+
20
+ super(app, :force, consumer_key, consumer_secret, options)
21
+ end
22
+
23
+ def user_data
24
+ @data ||= MultiJson.decode(@access_token.get(@access_token['id']))
25
+ end
26
+
27
+ # Monkey patch scheme for callback url
28
+ def full_host
29
+ uri = URI.parse(request.url)
30
+ uri.path = ''
31
+ uri.query = nil
32
+ uri.scheme = request.env['HTTP_X_FORWARDED_PROTO'] || request.scheme
33
+ uri.to_s
34
+ end
35
+
36
+ def request_phase
37
+ options[:response_type] ||= "code"
38
+ super
39
+ end
40
+
41
+ def get_access_token(verifier)
42
+ access_token = client.web_server.get_access_token(
43
+ verifier,
44
+ :redirect_uri => callback_url,
45
+ :grant_type => 'authorization_code').tap do |token|
46
+ token.token_param = 'oauth_token'
47
+ end
48
+
49
+ access_token
50
+ end
51
+
52
+ def callback_phase
53
+ if request.params['error'] || request.params['error_reason']
54
+ raise CallbackError.new(request.params['error'], request.params['error_description'] || request.params['error_reason'], request.params['error_uri'])
55
+ end
56
+
57
+ @access_token = get_access_token(request.params['code'])
58
+ @env['omniauth.auth'] = auth_hash
59
+ call_app!
60
+ rescue ::OAuth2::HTTPError, ::OAuth2::AccessDenied, CallbackError => e
61
+ fail!(:invalid_credentials, e)
62
+ end
63
+
64
+ def user_info
65
+ {
66
+ 'nickname' => user_data['nick_name'],
67
+ 'email' => user_data['email'],
68
+ 'name' => user_data['display_name'],
69
+ 'urls' => {
70
+ 'Force' => user_data['urls']['profile'],
71
+ }
72
+ }
73
+ end
74
+
75
+ def auth_hash
76
+ OmniAuth::Utils.deep_merge(super, {
77
+ 'uid' => user_data['user_id'],
78
+ 'user_info' => user_info,
79
+ 'extra' => {'user_hash' => user_data},
80
+ 'credentials' => { 'instance_url' => @access_token['instance_url'] }
81
+ })
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1 @@
1
+ require 'omniauth_force'
@@ -0,0 +1,3 @@
1
+ module OmniauthForce
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'ext/oauth2/client'
2
+ require 'omniauth/strategies/force'
3
+ require 'omniauth_force/version'
4
+
5
+ module OmniauthForce
6
+ end
7
+
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "omniauth_force/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "omniauth-force"
7
+ s.version = OmniauthForce::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Jacob Dam"]
10
+ s.email = ["ngocphuc@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Force.com strategies for OmniAuth.}
13
+ s.description = %q{Force.com strategies for OmniAuth.}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_dependency 'oa-oauth', '~> 0.1.6'
21
+ s.add_dependency 'multi_json', '~> 0.0.2'
22
+ s.add_dependency 'oauth2', '~> 0.1.1'
23
+ end
@@ -0,0 +1,82 @@
1
+ require "test_helper"
2
+
3
+ class ForceTest < ActiveSupport::TestCase
4
+ include Rack::Test::Methods
5
+
6
+ def dummy_app
7
+ @dummy_app ||= lambda { |env| [200, {}, ["Dummy app"]] }
8
+ end
9
+
10
+ def app
11
+ @app ||= OmniAuth::Strategies::Force.new(dummy_app, 'force-api-key', 'force-api-secret')
12
+ end
13
+
14
+ test "request phase should redirect to force login page with correct params" do
15
+ get '/auth/force'
16
+ assert last_response.redirect?
17
+
18
+ uri = URI.parse(last_response.location)
19
+ assert_equal uri.scheme, 'https'
20
+ assert_equal uri.host, 'login.salesforce.com'
21
+ assert_equal uri.path, '/services/oauth2/authorize'
22
+
23
+ params = CGI::parse(uri.query)
24
+ assert_equal params['client_id'], ['force-api-key']
25
+ assert_equal params['redirect_uri'], ['http://example.org/auth/force/callback']
26
+ assert_equal params['response_type'], ['code']
27
+ assert_equal params['type'], ['web_server']
28
+ end
29
+
30
+ test "callback phase should " do
31
+ sf_token = {
32
+ 'instance_url' => 'http://instance',
33
+ 'id' => 'http://instance/id/123',
34
+ 'access_token' => 'token123',
35
+ }
36
+ sf_user_data = {
37
+ 'user_id' => 123,
38
+ 'nick_name' => 123,
39
+ 'email' => 123,
40
+ 'display_name' => 123,
41
+ 'urls' => {
42
+ 'profile' => 'http://instance/profile/123'
43
+ },
44
+ }
45
+ auth_hash = nil
46
+ @dummy_app = lambda do |env|
47
+ auth_hash = env['omniauth.auth']
48
+ [200, {}, ["Dummy app"]]
49
+ end
50
+
51
+ connection = Faraday.new do |builder|
52
+ builder.adapter :test do |stub|
53
+ stub.post('/services/oauth2/token') {[ 200, {}, MultiJson.encode(sf_token) ]}
54
+ stub.get('/id/123?oauth_token=token123') {[ 200, {}, MultiJson.encode(sf_user_data) ]}
55
+ end
56
+ end
57
+
58
+
59
+ app.client.connection = connection
60
+ get '/auth/force/callback?code=code123'
61
+
62
+ assert_equal({
63
+ "provider" => "force",
64
+ "uid" => 123,
65
+ "credentials" => {
66
+ "token" => "token123",
67
+ "instance_url" => "http://instance"
68
+ },
69
+ "user_info" => {
70
+ "nickname"=>123,
71
+ "email"=>123,
72
+ "name"=>123,
73
+ "urls"=>{
74
+ "Force"=>"http://instance/profile/123"
75
+ }
76
+ },
77
+ "extra"=>{
78
+ "user_hash"=>sf_user_data
79
+ }
80
+ }, auth_hash)
81
+ end
82
+ end
@@ -0,0 +1,12 @@
1
+ require "rubygems"
2
+ require "bundler"
3
+
4
+ Bundler.require
5
+
6
+ require "test/unit"
7
+ require "active_support/test_case"
8
+ require "faraday"
9
+
10
+ require 'omniauth-force'
11
+
12
+ Faraday.default_adapter = :test
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-force
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Jacob Dam
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-03-15 00:00:00 +07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: oa-oauth
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 0.1.6
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 0.0.2
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: oauth2
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 0.1.1
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ description: Force.com strategies for OmniAuth.
50
+ email:
51
+ - ngocphuc@gmail.com
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files: []
57
+
58
+ files:
59
+ - .gitignore
60
+ - Gemfile
61
+ - Rakefile
62
+ - lib/ext/oauth2/client.rb
63
+ - lib/omniauth-force.rb
64
+ - lib/omniauth/strategies/force.rb
65
+ - lib/omniauth_force.rb
66
+ - lib/omniauth_force/version.rb
67
+ - omniauth-force.gemspec
68
+ - test/force_test.rb
69
+ - test/test_helper.rb
70
+ has_rdoc: true
71
+ homepage: ""
72
+ licenses: []
73
+
74
+ post_install_message:
75
+ rdoc_options: []
76
+
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: "0"
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ requirements: []
92
+
93
+ rubyforge_project:
94
+ rubygems_version: 1.5.2
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: Force.com strategies for OmniAuth.
98
+ test_files:
99
+ - test/force_test.rb
100
+ - test/test_helper.rb