exvo-auth 0.12.2 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,6 @@
1
+ *.gem
1
2
  .bundle
2
- pkg
3
+ .rvmrc
3
4
  Gemfile.lock
5
+ pkg/*
6
+ log/*
@@ -0,0 +1,155 @@
1
+ # OAuth2
2
+
3
+ * Get familiar with [OmniAuth by Intridea](http://github.com/intridea/omniauth). Read about OAuth2.
4
+ * Obtain `client_id` and `client_secret` for your app from Exvo.
5
+ * Install `exvo-auth` gem and add it to your Gemfile.
6
+
7
+
8
+
9
+ ## Middleware configuration
10
+
11
+ The preferred way to configure the gem is via the ENV variables:
12
+
13
+ ```ruby
14
+ ENV['AUTH_CLIENT_ID'] = "foo"
15
+ ENV['AUTH_CLIENT_SECRET'] = "bar"
16
+ ENV['AUTH_DEBUG'] = true # [OPTIONAL] dumps all HTTP traffic to STDERR, useful during development
17
+ ENV['AUTH_REQUIRE_SSL'] = false # [OPTIONAL] disable SSL, useful in development (note that all apps API urls must be http, not https)
18
+ ENV['AUTH_HOST'] = "test.exvo.com" # [OPTIONAL] override the default auth host
19
+ ```
20
+
21
+ Then add this line to `config/application.rb`:
22
+
23
+ ```ruby
24
+ config.middleware.use ExvoAuth::Middleware
25
+ ```
26
+
27
+ But you can also set things directly in the `config/application.rb` file (before the middleware declaration):
28
+
29
+ ```ruby
30
+ ExvoAuth::Config.client_id = "foo"
31
+ ExvoAuth::Config.client_secret = "bar"
32
+ ExvoAuth::Config.debug = true
33
+ ExvoAuth::Config.require_ssl = false
34
+ ExvoAuth::Config.host = "test.exvo.com"
35
+ ```
36
+
37
+
38
+ ## Add routes
39
+
40
+ The following comes from Rails `config/routes.rb` file:
41
+
42
+ ```ruby
43
+ match "/auth/failure" => "sessions#failure"
44
+ match "/auth/interactive/callback" => "sessions#create"
45
+ match "/auth/non_interactive/callback" => "sessions#create" # only if you use json-based login
46
+ match "/sign_out" => "sessions#destroy"
47
+ ```
48
+
49
+ Failure url is called whenever there's a failure (d'oh).
50
+
51
+ You can have separate callbacks for interactive and non-interactive callback routes but you can also route both callbacks to the same controller method like shown above.
52
+
53
+
54
+ ## Include controller helpers into your application controller
55
+
56
+ ```ruby
57
+ include ExvoAuth::Controllers::Rails # (or Merb)
58
+ ```
59
+
60
+
61
+ ## Implement a sessions controller
62
+
63
+ Sample implementation (Rails):
64
+
65
+ ```ruby
66
+ class SessionsController < ApplicationController
67
+ def create
68
+ sign_in_and_redirect!
69
+ end
70
+
71
+ def destroy
72
+ sign_out_and_redirect!
73
+ end
74
+
75
+ def failure
76
+ render :text => "Sorry!"
77
+ end
78
+ end
79
+ ```
80
+
81
+
82
+ ## Implement `#find_or_create_user_by_uid(uid)` in your Application Controller
83
+
84
+ This method will be called by `#current_user`. Previously we did this in `sessions_controller` but since the sharing sessions changes this controller will not be used in most cases because the session comes from another app through a shared cookie. This method should find user by uid or create it.
85
+
86
+ Exemplary implementation (Rails):
87
+
88
+ ```ruby
89
+ def find_or_create_user_by_uid(uid)
90
+ User.find_or_create_by_uid(uid)
91
+ end
92
+ ```
93
+
94
+ Additional info (emails, etc) can be obtained using auth api (`/users/uid.json` path).
95
+
96
+ In short: you get `params[:auth]`. Do what you want to do with it: store the data, create session, etc.
97
+
98
+
99
+ ## Sign up and sign in paths for use in links
100
+
101
+ ```ruby
102
+ sign in path: "/auth/interactive"
103
+ sign up path: "/auth/interactive?x_sign_up=true" # this is OAuth2 custom param
104
+ sign in path with a return address: "/auth/interactive?state=url" # using OAuth2 state param
105
+ ```
106
+
107
+ You have a handy methods available in controllers (and views in Rails): `sign_in_path` and `sign_up_path`.
108
+
109
+
110
+ ## Read the source, there are few features not mentioned in this README
111
+
112
+
113
+ # Inter-Application Communication
114
+
115
+ You need to have "App Authorization" created by Exvo first.
116
+
117
+ Contact us and provide following details:
118
+
119
+ * `consumer_id` - Id of an app that will be a consumer (this is you)
120
+ * `provider_id` - Id of the provider app
121
+ * `scope` - The tag associated with the api you want to use in the provider app
122
+
123
+
124
+ ## Consumer side
125
+
126
+ ```ruby
127
+ consumer = ExvoAuth::Autonomous::Consumer.new(
128
+ :app_id => "this is client_id of the app you want to connect to"
129
+ )
130
+ consumer.get(*args) # interface is exactly the same like in HTTParty. All http methods are available (post, put, delete, head, options).
131
+ ```
132
+
133
+
134
+ ## Provider side
135
+
136
+ See `#authenticate_app_in_scope!(scope)` method in `ExvoAuth::Controllers::Rails` (or Merb). This method lets you create a before filter.
137
+ Scopes are used by providing app to check if a given consuming app should have access to a given resource inside a scope.
138
+ If scopes are empty, then provider app should not present any resources to consumer.
139
+
140
+
141
+ ## Example of the before filter for provider controller:
142
+
143
+ ```ruby
144
+ before_filter {|c| c.authenticate_app_in_scope!("payments") }
145
+ ```
146
+
147
+ In provider controller, which is just a fancy name for API controller, you can use `#current_app_id` method to get the app_id of the app connecting.
148
+
149
+
150
+ # Dejavu - replay non-GET requests after authentication redirects
151
+
152
+ ## Limitations:
153
+
154
+ * doesn't work with file uploads
155
+ * all request params become query params when replayed
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Jacek Becela"]
9
9
  s.email = ["jacek.becela@gmail.com"]
10
- s.homepage = "http://rubygems.org/gems/exvo-auth"
10
+ s.homepage = "https://github.com/Exvo/Auth"
11
11
  s.summary = "Sign in with Exvo account"
12
12
  s.description = "Sign in with Exvo account"
13
13
 
@@ -19,9 +19,14 @@ Gem::Specification.new do |s|
19
19
  s.add_dependency "activemodel", "~> 3.0.0"
20
20
  s.add_dependency "actionpack", "~> 3.0.0"
21
21
 
22
- s.add_development_dependency "mocha", "~> 0.9.8"
23
- s.add_development_dependency "test-unit", "~> 2.1.0"
24
- s.add_development_dependency "bundler", "~> 1.0.0"
22
+ s.add_development_dependency "mocha"
23
+ s.add_development_dependency "test-unit"
24
+ s.add_development_dependency "bundler"
25
+ s.add_development_dependency "rake"
26
+ s.add_development_dependency "guard"
27
+ s.add_development_dependency "guard-test"
28
+ s.add_development_dependency "rb-fsevent"
29
+ s.add_development_dependency "rb-inotify"
25
30
 
26
31
  s.files = `git ls-files`.split("\n")
27
32
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
@@ -3,7 +3,7 @@ class ExvoAuth::Autonomous::Auth
3
3
  include ExvoAuth::Autonomous::Http
4
4
 
5
5
  def base_uri
6
- ExvoAuth::Config.host
6
+ ExvoAuth::Config.uri
7
7
  end
8
8
 
9
9
  def username
@@ -1,56 +1,95 @@
1
1
  module ExvoAuth::Config
2
2
  def self.debug
3
- @@debug = false unless defined?(@@debug)
4
- @@debug
3
+ @@debug ||= ENV['AUTH_DEBUG'] || false
5
4
  end
6
5
 
7
6
  def self.debug=(debug)
8
7
  @@debug = debug
9
8
  end
10
9
 
11
- def self.host
12
- @@host ||= 'https://auth.exvo.com'
10
+ def self.host
11
+ @@host ||= ENV['AUTH_HOST'] || default_opts[env.to_sym][:host]
13
12
  end
14
-
15
- def self.host=(host)
16
- @@host = host
13
+
14
+ def self.host=(host)
15
+ @@host = host
16
+ end
17
+
18
+ def self.uri
19
+ if host =~ /^http(s)*/
20
+ # Legacy compatibility, when `host` was incorrectly used as `uri`
21
+ host
22
+ else
23
+ require_ssl ? "https://#{host}" : "http://#{host}"
24
+ end
17
25
  end
18
-
26
+
19
27
  def self.callback_key
20
28
  @@callback_key ||= '_callback'
21
29
  end
22
-
30
+
23
31
  def self.callback_key=(callback_key)
24
- @@callback_key = callback_key
32
+ @@callback_key = callback_key
25
33
  end
26
-
34
+
27
35
  def self.client_id
28
- @@client_id ||= nil
36
+ @@client_id ||= ENV['AUTH_CLIENT_ID']
29
37
  end
30
-
38
+
31
39
  def self.client_id=(client_id)
32
40
  @@client_id = client_id
33
41
  end
34
-
42
+
35
43
  def self.client_secret
36
- @@client_secret ||= nil
44
+ @@client_secret ||= ENV['AUTH_CLIENT_SECRET']
37
45
  end
38
46
 
39
47
  def self.client_secret=(client_secret)
40
48
  @@client_secret = client_secret
41
49
  end
42
-
50
+
43
51
  def self.require_ssl
44
- @@require_ssl = true unless defined?(@@require_ssl)
45
- @@require_ssl
52
+ @@require_ssl ||= ENV['AUTH_REQUIRE_SSL'] || default_opts[env.to_sym][:require_ssl]
46
53
  end
47
54
 
48
- # Set this to false during development ONLY!
49
55
  def self.require_ssl=(require_ssl)
50
56
  @@require_ssl = require_ssl
51
57
  end
52
-
58
+
59
+ def self.env
60
+ @@env ||= Rails.env if defined?(Rails)
61
+ @@env ||= Merb.env if defined?(Merb)
62
+ @@env
63
+ end
64
+
65
+ def self.env=(env)
66
+ @@env = env
67
+ end
68
+
53
69
  def self.cfs_id
54
70
  "fb0e7bd5864aa0186630212d800af8a6"
55
71
  end
72
+
73
+ private
74
+
75
+ def self.default_opts
76
+ {
77
+ :production => {
78
+ :host => 'auth.exvo.com',
79
+ :require_ssl => true
80
+ },
81
+ :staging => {
82
+ :host => 'staging.auth.exvo.com',
83
+ :require_ssl => false
84
+ },
85
+ :development => {
86
+ :host => 'auth.exvo.local',
87
+ :require_ssl => false
88
+ },
89
+ :test => {
90
+ :host => 'auth.exvo.local',
91
+ :require_ssl => false
92
+ }
93
+ }
94
+ end
56
95
  end
@@ -20,7 +20,7 @@ module ExvoAuth::Controllers::Base
20
20
  session[:user_uid] = request.env["rack.request.query_hash"]["auth"]["uid"]
21
21
 
22
22
  url = if params[:state] == "popup"
23
- ExvoAuth::Config.host + "/close_popup.html"
23
+ ExvoAuth::Config.uri + "/close_popup.html"
24
24
  elsif params[:state] # if not popup then an url
25
25
  params[:state]
26
26
  else
@@ -81,7 +81,7 @@ module ExvoAuth::Controllers::Base
81
81
  end
82
82
 
83
83
  def sign_out_url(return_to)
84
- ExvoAuth::Config.host + "/users/sign_out?" + Rack::Utils.build_query({ :return_to => return_to })
84
+ ExvoAuth::Config.uri + "/users/sign_out?" + Rack::Utils.build_query({ :return_to => return_to })
85
85
  end
86
86
 
87
87
  def non_interactive_sign_in_path(params = {})
@@ -1,11 +1,11 @@
1
1
  class ExvoAuth::Strategies::Base < OmniAuth::Strategies::OAuth2
2
2
  def initialize(app, name, options = {})
3
- options[:site] ||= ExvoAuth::Config.host
3
+ options[:site] ||= ExvoAuth::Config.uri
4
4
  options[:client_id] ||= ExvoAuth::Config.client_id
5
5
  options[:client_secret] ||= ExvoAuth::Config.client_secret
6
6
 
7
7
  if options[:site].nil? || options[:client_id].nil? || options[:client_secret].nil?
8
- raise(ArgumentError, "Please configure host, client_id and client_secret")
8
+ raise(ArgumentError, "Please configure uri, client_id and client_secret")
9
9
  end
10
10
 
11
11
  super(app, name, options.delete(:client_id), options.delete(:client_secret), options)
@@ -1,3 +1,3 @@
1
1
  module ExvoAuth
2
- VERSION = "0.12.2"
2
+ VERSION = "0.13.0"
3
3
  end
@@ -1,5 +1,4 @@
1
1
  require 'rubygems'
2
- gem 'test-unit'
3
2
  require 'test/unit'
4
3
  require 'mocha'
5
4
  require 'exvo-auth'
@@ -5,13 +5,13 @@ class TestExvoAuth < Test::Unit::TestCase
5
5
  ExvoAuth::Config.client_id = "foo"
6
6
  ExvoAuth::Config.client_secret = "bar"
7
7
  end
8
-
8
+
9
9
  test "consumer sanity" do
10
10
  c = ExvoAuth::Autonomous::Consumer.new(:app_id => "baz")
11
11
  authorization = { "access_token" => "qux", "url" => "https://foo/api" }
12
12
  auth = stub(:get => { "authorization" => authorization })
13
13
  c.expects(:auth).returns(auth)
14
-
14
+
15
15
  assert_equal authorization, c.send(:authorization)
16
16
  assert_equal authorization, c.send(:authorization) # second time from cache, without touching httparty
17
17
  end
@@ -20,11 +20,11 @@ class TestExvoAuth < Test::Unit::TestCase
20
20
  p = ExvoAuth::Autonomous::Provider.new(:app_id => "baz", :access_token => "qux")
21
21
  auth = stub(:get => {"scope" => "qux quux"})
22
22
  p.expects(:auth).returns(auth)
23
-
23
+
24
24
  assert_equal ["qux", "quux"], p.scopes
25
25
  assert_equal ["qux", "quux"], p.scopes # second time from cache, without touching httparty
26
26
  end
27
-
27
+
28
28
  test "integration of httparty interface with auth" do
29
29
  c = ExvoAuth::Autonomous::Consumer.new(:app_id => "baz")
30
30
  basement = mock("basement")
@@ -34,9 +34,36 @@ class TestExvoAuth < Test::Unit::TestCase
34
34
  c.expects(:basement).at_least_once.returns(basement)
35
35
  assert_true c.get("/bar")
36
36
  end
37
-
37
+
38
38
  test "basement includes httparty" do
39
39
  c = ExvoAuth::Autonomous::Consumer.new(:app_id => "baz")
40
40
  assert_true c.send(:basement).included_modules.include?(HTTParty)
41
41
  end
42
+
43
+ test "host setting based on production environment" do
44
+ ExvoAuth::Config.host = nil # invalidate memoization
45
+ ExvoAuth::Config.expects(:env).returns('production')
46
+ assert_equal ExvoAuth::Config.host, 'auth.exvo.com'
47
+ end
48
+
49
+ test "host setting based on development environment" do
50
+ ExvoAuth::Config.host = nil # invalidate memoization
51
+ ExvoAuth::Config.expects(:env).returns('development')
52
+ assert_equal ExvoAuth::Config.host, 'auth.exvo.local'
53
+ end
54
+
55
+ test "ssl not being required by default in development environment" do
56
+ ExvoAuth::Config.require_ssl = nil # invalidate memoization
57
+ ExvoAuth::Config.expects(:env).returns('development')
58
+ assert_false ExvoAuth::Config.require_ssl
59
+ end
60
+
61
+ test "ENV setting overrides default auth host setting" do
62
+ ExvoAuth::Config.host = nil # invalidate memoization
63
+ host = 'test.exvo.com'
64
+ ENV['AUTH_HOST'] = host
65
+ ExvoAuth::Config.expects(:env).at_least(0)
66
+ assert_equal host, ExvoAuth::Config.host
67
+ ENV['AUTH_HOST'] = nil
68
+ end
42
69
  end
@@ -2,10 +2,11 @@ require 'helper'
2
2
 
3
3
  class TestIntegration < Test::Unit::TestCase
4
4
  def setup
5
- ExvoAuth::Config.host = "https://staging.auth.exvo.com"
5
+ ExvoAuth::Config.host = "staging.auth.exvo.com"
6
6
  ExvoAuth::Config.client_id = "foo"
7
7
  ExvoAuth::Config.client_secret = "bar"
8
8
  ExvoAuth::Config.debug = true
9
+ ExvoAuth::Config.require_ssl = true
9
10
  end
10
11
 
11
12
  test "integration with staging.auth.exvo.com" do
metadata CHANGED
@@ -1,148 +1,158 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: exvo-auth
3
- version: !ruby/object:Gem::Version
4
- hash: 43
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 12
9
- - 2
10
- version: 0.12.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.13.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jacek Becela
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-09-19 00:00:00 +02:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-11-03 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: oa-oauth
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &83727760 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
18
+ requirements:
27
19
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 23
30
- segments:
31
- - 0
32
- - 0
33
- - 4
20
+ - !ruby/object:Gem::Version
34
21
  version: 0.0.4
35
22
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: httparty
39
23
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *83727760
25
+ - !ruby/object:Gem::Dependency
26
+ name: httparty
27
+ requirement: &83727530 !ruby/object:Gem::Requirement
41
28
  none: false
42
- requirements:
29
+ requirements:
43
30
  - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 5
46
- segments:
47
- - 0
48
- - 6
49
- - 1
31
+ - !ruby/object:Gem::Version
50
32
  version: 0.6.1
51
33
  type: :runtime
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: activemodel
55
34
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *83727530
36
+ - !ruby/object:Gem::Dependency
37
+ name: activemodel
38
+ requirement: &83727300 !ruby/object:Gem::Requirement
57
39
  none: false
58
- requirements:
40
+ requirements:
59
41
  - - ~>
60
- - !ruby/object:Gem::Version
61
- hash: 7
62
- segments:
63
- - 3
64
- - 0
65
- - 0
42
+ - !ruby/object:Gem::Version
66
43
  version: 3.0.0
67
44
  type: :runtime
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: actionpack
71
45
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *83727300
47
+ - !ruby/object:Gem::Dependency
48
+ name: actionpack
49
+ requirement: &83727070 !ruby/object:Gem::Requirement
73
50
  none: false
74
- requirements:
51
+ requirements:
75
52
  - - ~>
76
- - !ruby/object:Gem::Version
77
- hash: 7
78
- segments:
79
- - 3
80
- - 0
81
- - 0
53
+ - !ruby/object:Gem::Version
82
54
  version: 3.0.0
83
55
  type: :runtime
84
- version_requirements: *id004
85
- - !ruby/object:Gem::Dependency
86
- name: mocha
87
56
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: *83727070
58
+ - !ruby/object:Gem::Dependency
59
+ name: mocha
60
+ requirement: &83726880 !ruby/object:Gem::Requirement
89
61
  none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- hash: 43
94
- segments:
95
- - 0
96
- - 9
97
- - 8
98
- version: 0.9.8
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
99
66
  type: :development
100
- version_requirements: *id005
101
- - !ruby/object:Gem::Dependency
102
- name: test-unit
103
67
  prerelease: false
104
- requirement: &id006 !ruby/object:Gem::Requirement
68
+ version_requirements: *83726880
69
+ - !ruby/object:Gem::Dependency
70
+ name: test-unit
71
+ requirement: &83726650 !ruby/object:Gem::Requirement
105
72
  none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- hash: 11
110
- segments:
111
- - 2
112
- - 1
113
- - 0
114
- version: 2.1.0
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
115
77
  type: :development
116
- version_requirements: *id006
117
- - !ruby/object:Gem::Dependency
78
+ prerelease: false
79
+ version_requirements: *83726650
80
+ - !ruby/object:Gem::Dependency
118
81
  name: bundler
82
+ requirement: &83726440 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
119
89
  prerelease: false
120
- requirement: &id007 !ruby/object:Gem::Requirement
90
+ version_requirements: *83726440
91
+ - !ruby/object:Gem::Dependency
92
+ name: rake
93
+ requirement: &83726230 !ruby/object:Gem::Requirement
121
94
  none: false
122
- requirements:
123
- - - ~>
124
- - !ruby/object:Gem::Version
125
- hash: 23
126
- segments:
127
- - 1
128
- - 0
129
- - 0
130
- version: 1.0.0
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *83726230
102
+ - !ruby/object:Gem::Dependency
103
+ name: guard
104
+ requirement: &83726020 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *83726020
113
+ - !ruby/object:Gem::Dependency
114
+ name: guard-test
115
+ requirement: &83725810 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
131
121
  type: :development
132
- version_requirements: *id007
122
+ prerelease: false
123
+ version_requirements: *83725810
124
+ - !ruby/object:Gem::Dependency
125
+ name: rb-fsevent
126
+ requirement: &83725600 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *83725600
135
+ - !ruby/object:Gem::Dependency
136
+ name: rb-inotify
137
+ requirement: &83725390 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *83725390
133
146
  description: Sign in with Exvo account
134
- email:
147
+ email:
135
148
  - jacek.becela@gmail.com
136
149
  executables: []
137
-
138
150
  extensions: []
139
-
140
151
  extra_rdoc_files: []
141
-
142
- files:
152
+ files:
143
153
  - .gitignore
144
154
  - Gemfile
145
- - README.markdown
155
+ - README.md
146
156
  - Rakefile
147
157
  - exvo-auth.gemspec
148
158
  - lib/exvo-auth.rb
@@ -169,41 +179,28 @@ files:
169
179
  - test/helper.rb
170
180
  - test/test_exvo_auth.rb
171
181
  - test/test_integration.rb
172
- has_rdoc: true
173
- homepage: http://rubygems.org/gems/exvo-auth
182
+ homepage: https://github.com/Exvo/Auth
174
183
  licenses: []
175
-
176
184
  post_install_message:
177
185
  rdoc_options: []
178
-
179
- require_paths:
186
+ require_paths:
180
187
  - lib
181
- required_ruby_version: !ruby/object:Gem::Requirement
188
+ required_ruby_version: !ruby/object:Gem::Requirement
182
189
  none: false
183
- requirements:
184
- - - ">="
185
- - !ruby/object:Gem::Version
186
- hash: 3
187
- segments:
188
- - 0
189
- version: "0"
190
- required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
195
  none: false
192
- requirements:
193
- - - ">="
194
- - !ruby/object:Gem::Version
195
- hash: 23
196
- segments:
197
- - 1
198
- - 3
199
- - 6
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
200
199
  version: 1.3.6
201
200
  requirements: []
202
-
203
201
  rubyforge_project: exvo-auth
204
- rubygems_version: 1.3.7
202
+ rubygems_version: 1.8.10
205
203
  signing_key:
206
204
  specification_version: 3
207
205
  summary: Sign in with Exvo account
208
206
  test_files: []
209
-
@@ -1,108 +0,0 @@
1
- #OAuth2
2
-
3
- - Get familiar with OmniAuth by Intridea: http://github.com/intridea/omniauth. Read about OAuth2.
4
- - Obtain client_id and client_secret for your app from Exvo.
5
- - Install exvo-auth gem or add it to your Gemfile.
6
-
7
-
8
- ##Configure middleware.
9
-
10
- In Rails, the relevant lines could look like this:
11
-
12
- ExvoAuth::Config.client_id = "foo"
13
- ExvoAuth::Config.client_secret = "bar"
14
- ExvoAuth::Config.debug = true # dumps all HTTP traffic to STDERR, useful during development.
15
- config.middleware.use ExvoAuth::Middleware
16
-
17
-
18
- ##Add routes.
19
-
20
- The following comes from Rails config/routes.rb file:
21
-
22
- match "/auth/failure" => "sessions#failure"
23
- match "/auth/interactive/callback" => "sessions#create"
24
- match "/auth/non_interactive/callback" => "sessions#create" # only if you use json-based login
25
- match "/sign_out" => "sessions#destroy"
26
-
27
- Failure url is called whenever there's a failure (d'oh).
28
- You can have separate callbacks for interactive and non-interactive
29
- callback routes but you can also route both callbacks to the same controller method
30
- like shown above.
31
-
32
- ##Include controller helpers into your application controller.
33
-
34
- include ExvoAuth::Controllers::Rails (or Merb)
35
-
36
- ##Implement a sessions controller.
37
-
38
- Sample implementation (Rails):
39
-
40
- class SessionsController < ApplicationController
41
- def create
42
- sign_in_and_redirect!
43
- end
44
-
45
- def destroy
46
- sign_out_and_redirect!
47
- end
48
-
49
- def failure
50
- render :text => "Sorry!"
51
- end
52
- end
53
-
54
- ##Implement #find_or_create_user_by_uid(uid) in your Application Controller.
55
-
56
- This method will be called by #current_user. Previously we did this in sessions_controller but since the sharing sessions changes this controller
57
- will not be used in most cases because the session comes from another app through a shared cookie. This method should find user by uid or create it.
58
- Additional info (emails, etc) can be obtained using auth api (/users/uid.json path).
59
-
60
- In short: you get params[:auth]. Do what you want to do with it: store the data, create session, etc.
61
-
62
-
63
- ##Sign up and sign in paths for use in links.
64
-
65
- sign in path: "/auth/interactive"
66
- sign up path: "/auth/interactive?x_sign_up=true" # this is OAuth2 custom param
67
- sign in path with a return address: "/auth/interactive?state=url" # using OAuth2 state param
68
-
69
- You have a handy methods available in controllers (and views in Rails): sign_in_path and sign_up_path.
70
-
71
- ##Read the source, there are few features not mentioned in this README.
72
-
73
-
74
- #Inter-Application Communication
75
-
76
- You need to have "App Authorization" created by Exvo first.
77
- Contact us and provide following details:
78
-
79
- - consumer_id - Id of an app that will be a consumer (this is you)
80
- - provider_id - Id of the provider app
81
- - scope - The tag associated with the api you want to use in the provider app
82
-
83
- ##Consumer side
84
-
85
- consumer = ExvoAuth::Autonomous::Consumer.new(
86
- :app_id => "this is client_id of the app you want to connect to"
87
- )
88
- consumer.get(*args) - interface is exactly the same like in HTTParty. All http methods are available (post, put, delete, head, options).
89
-
90
- ##Provider side
91
-
92
- See #authenticate_app_in_scope!(scope) method in ExvoAuth::Controllers::Rails (or Merb). This method lets you create a before filter.
93
- Scopes are used by providing app to check if a given consuming app should have access to a given resource inside a scope.
94
- If scopes are empty, then provider app should not present any resources to consumer.
95
-
96
- ##Example of the before filter for provider controller:
97
-
98
- before_filter {|c| c.authenticate_app_in_scope!("payments") }
99
-
100
- In provider controller which is just a fancy name for API controller you can use #current_app_id method to get the app_id of the app connecting.
101
-
102
-
103
- #Dejavu - replay non-GET requests after authentication redirects
104
-
105
- ##Limitations:
106
-
107
- - doesn't work with file uploads
108
- - all request params become query params when replayed