omniauth-taskrabbit 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +9 -0
- data/Gemfile +7 -0
- data/README.md +88 -0
- data/Rakefile +6 -0
- data/examples/config.ru +43 -0
- data/examples/omni_auth.rb +3 -0
- data/lib/omniauth-taskrabbit.rb +1 -0
- data/lib/omniauth/strategies/taskrabbit.rb +65 -0
- data/lib/omniauth/taskrabbit.rb +2 -0
- data/lib/omniauth/taskrabbit/version.rb +5 -0
- data/omniauth-taskrabbit.gemspec +22 -0
- data/spec/omniauth/strategies/taskrabbit_spec.rb +39 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/support/shared_examples.rb +37 -0
- metadata +116 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# OmniAuth TaskRabbit
|
2
|
+
|
3
|
+
TaskRabbit OAuth2 Strategy for OmniAuth 1.0.
|
4
|
+
|
5
|
+
Supports the OAuth 2.0 server-side and client-side flows.
|
6
|
+
|
7
|
+
## Installing
|
8
|
+
|
9
|
+
Add to your `Gemfile`:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'omniauth-taskrabbit'
|
13
|
+
```
|
14
|
+
|
15
|
+
Then `bundle install`.
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
Add to a Rails app in `config/initializers/omniauth.rb`:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
Rails.application.config.middleware.use OmniAuth::Builder do
|
23
|
+
provider :taskrabbit, ENV['TR_API_KEY'], ENV['TR_SECRET']
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
## Auth Hash
|
28
|
+
|
29
|
+
Here's an example *Auth Hash* available in `request.env['omniauth.auth']`:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
{
|
33
|
+
:provider => 'taskrabbit',
|
34
|
+
:uid => 283559,
|
35
|
+
:info => {
|
36
|
+
:email => "sponge.bob@example.com"
|
37
|
+
:first_name => "Bob",
|
38
|
+
:last_name => "Sponge",
|
39
|
+
:full_name => "Bob Sponge",
|
40
|
+
:zip_code => "21314",
|
41
|
+
:city: {
|
42
|
+
:id: 1,
|
43
|
+
:name: "Boston"
|
44
|
+
},
|
45
|
+
},
|
46
|
+
:credentials => {
|
47
|
+
:token => 'oXOIDNEOInwiewniwnaiNSiocnione', # OAuth 2.0 access_token, which you may wish to store
|
48
|
+
:expires => false
|
49
|
+
},
|
50
|
+
:extra => {
|
51
|
+
:raw_info => {
|
52
|
+
:id => 283559,
|
53
|
+
:zip_code => "21314",
|
54
|
+
:first_name => "Bob",
|
55
|
+
:last_name => "Sponge",
|
56
|
+
:full_name => "Bob Sponge",
|
57
|
+
:short_name => "Bob",
|
58
|
+
:display_name => "Bob S.",
|
59
|
+
:email => "sponge.bob@example.com",
|
60
|
+
:city: {
|
61
|
+
:id: 1,
|
62
|
+
:name: "Boston"
|
63
|
+
},
|
64
|
+
:links => {
|
65
|
+
:avatar_url => "https://www.taskrabbit.com/images/default_avatars/poster_thumb.png",
|
66
|
+
:get => "/api/v1/users/283559"
|
67
|
+
},
|
68
|
+
:tasks => {
|
69
|
+
:links => {
|
70
|
+
:get => "/api/v1/users/283559/tasks",
|
71
|
+
:last => "/api/v1/users/283559/tasks?page=1",
|
72
|
+
:first => "/api/v1/users/283559/tasks?page=1"
|
73
|
+
}
|
74
|
+
},
|
75
|
+
:locations => {
|
76
|
+
:links => {
|
77
|
+
:get => "/api/v1/users/283559/locations"
|
78
|
+
}
|
79
|
+
},
|
80
|
+
:counts => {
|
81
|
+
:posted_tasks => 5,
|
82
|
+
:ongoing_tasks => 2,
|
83
|
+
:active_tasks => 1
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
```
|
data/Rakefile
ADDED
data/examples/config.ru
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Sample app for TaskRabbit OAuth2 Strategy
|
2
|
+
# Make sure to setup the ENV variables TR_API_KEY and TR_SECRET
|
3
|
+
# Run with "bundle exec rackup"
|
4
|
+
ENV['TR_API_KEY'] = 'ior8jfh723hfD8fj9eSi383Niojreiu3U832hf90'
|
5
|
+
ENV['TR_API_SECRET'] = 'pfjf7dfw392h2D2iofkjpxqdreLKue523tdnbdff'
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'bundler'
|
9
|
+
require 'sinatra'
|
10
|
+
require 'omniauth'
|
11
|
+
require 'omniauth-taskrabbit'
|
12
|
+
require 'openssl'
|
13
|
+
require 'debugger'
|
14
|
+
|
15
|
+
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
|
16
|
+
|
17
|
+
class App < Sinatra::Base
|
18
|
+
get '/' do
|
19
|
+
<<-HTML
|
20
|
+
<ul>
|
21
|
+
<li><a href='/auth/taskrabbit'>Sign in with TaskRabbit</a></li>
|
22
|
+
</ul>
|
23
|
+
HTML
|
24
|
+
end
|
25
|
+
|
26
|
+
get '/auth/:provider/callback' do
|
27
|
+
content_type 'text/plain'
|
28
|
+
request.env['omniauth.auth'].to_hash.inspect rescue "No Data"
|
29
|
+
end
|
30
|
+
|
31
|
+
get '/auth/failure' do
|
32
|
+
content_type 'text/plain'
|
33
|
+
request.env['omniauth.auth'].to_hash.inspect rescue "No Data"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
use Rack::Session::Cookie, :secret => ENV['RACK_COOKIE_SECRET']
|
38
|
+
|
39
|
+
use OmniAuth::Builder do
|
40
|
+
provider :taskrabbit, ENV['TR_API_KEY'], ENV['TR_API_SECRET']
|
41
|
+
end
|
42
|
+
|
43
|
+
run App.new
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'omniauth/taskrabbit'
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'omniauth/strategies/oauth2'
|
2
|
+
|
3
|
+
module OmniAuth
|
4
|
+
module Strategies
|
5
|
+
class TaskRabbit < OmniAuth::Strategies::OAuth2
|
6
|
+
option :name, "taskrabbit"
|
7
|
+
|
8
|
+
option :client_options, {
|
9
|
+
:site => "https://www.taskrabbit.com",
|
10
|
+
:authorize_url => '/api/authorize',
|
11
|
+
:request_token_url => "/api/oauth/request_token",
|
12
|
+
:token_url => '/api/oauth/token'
|
13
|
+
}
|
14
|
+
|
15
|
+
option :access_token_options, {
|
16
|
+
:header_format => 'OAuth %s',
|
17
|
+
:param_name => 'access_token'
|
18
|
+
}
|
19
|
+
|
20
|
+
uid { raw_info['id'] }
|
21
|
+
|
22
|
+
info do
|
23
|
+
prune!({
|
24
|
+
'email' => raw_info['email'],
|
25
|
+
'first_name' => raw_info['first_name'],
|
26
|
+
'last_name' => raw_info['last_name'],
|
27
|
+
'full_name' => raw_info['full_name'],
|
28
|
+
'zip_code' => raw_info['zip_code'],
|
29
|
+
'city' => raw_info['city'],
|
30
|
+
})
|
31
|
+
end
|
32
|
+
|
33
|
+
extra do
|
34
|
+
prune!({
|
35
|
+
'raw_info' => raw_info
|
36
|
+
})
|
37
|
+
end
|
38
|
+
|
39
|
+
def raw_info
|
40
|
+
@raw_info ||= access_token.get('/api/v1/account').parsed
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_access_token
|
44
|
+
super.tap do |token|
|
45
|
+
token.options.merge!(access_token_options)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def access_token_options
|
50
|
+
options.access_token_options.inject({}) { |h,(k,v)| h[k.to_sym] = v; h }
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def prune!(hash)
|
56
|
+
hash.delete_if do |_, value|
|
57
|
+
prune!(value) if value.is_a?(Hash)
|
58
|
+
value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
OmniAuth.config.add_camelization 'taskrabbit', 'TaskRabbit'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'omniauth/taskrabbit/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'omniauth-taskrabbit'
|
7
|
+
s.version = OmniAuth::TaskRabbit::VERSION
|
8
|
+
s.authors = ['Jean-Richard Lai']
|
9
|
+
s.email = ['jrichardlai@gmail.com']
|
10
|
+
s.summary = 'Taskrabbit strategy for OmniAuth'
|
11
|
+
s.homepage = 'https://github.com/jrichardlai/omniauth-taskrabbit'
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split("\n")
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
16
|
+
s.require_paths = ['lib']
|
17
|
+
|
18
|
+
s.add_runtime_dependency 'omniauth-oauth2', '~> 1.0.2'
|
19
|
+
|
20
|
+
s.add_development_dependency 'rspec', '~> 2'
|
21
|
+
s.add_development_dependency 'rake'
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'omniauth-taskrabbit'
|
3
|
+
require 'openssl'
|
4
|
+
require 'base64'
|
5
|
+
|
6
|
+
describe OmniAuth::Strategies::TaskRabbit do
|
7
|
+
before :each do
|
8
|
+
@request = double('Request')
|
9
|
+
@request.stub(:params) { {} }
|
10
|
+
@request.stub(:cookies) { {} }
|
11
|
+
@request.stub(:env) { {} }
|
12
|
+
|
13
|
+
@client_id = '123'
|
14
|
+
@client_secret = '53cr3tz'
|
15
|
+
end
|
16
|
+
|
17
|
+
subject do
|
18
|
+
args = [@client_id, @client_secret, @options].compact
|
19
|
+
OmniAuth::Strategies::TaskRabbit.new(nil, *args).tap do |strategy|
|
20
|
+
strategy.stub(:request) { @request }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it_should_behave_like 'an oauth2 strategy'
|
25
|
+
|
26
|
+
describe '#client' do
|
27
|
+
it 'has correct TaskRabbit site' do
|
28
|
+
subject.client.site.should eq('https://www.taskrabbit.com')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'has correct authorize url' do
|
32
|
+
subject.client.options[:authorize_url].should eq('/api/authorize')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'has correct token url' do
|
36
|
+
subject.client.options[:token_url].should eq('/api/oauth/token')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# NOTE it would be useful if this lived in omniauth-oauth2 eventually
|
2
|
+
shared_examples 'an oauth2 strategy' do
|
3
|
+
describe '#client' do
|
4
|
+
it 'should be initialized with symbolized client_options' do
|
5
|
+
@options = { :client_options => { 'authorize_url' => 'https://example.com' } }
|
6
|
+
subject.client.options[:authorize_url].should == 'https://example.com'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#authorize_params' do
|
11
|
+
it 'should include any authorize params passed in the :authorize_params option' do
|
12
|
+
@options = { :authorize_params => { :foo => 'bar', :baz => 'zip' } }
|
13
|
+
subject.authorize_params['foo'].should eq('bar')
|
14
|
+
subject.authorize_params['baz'].should eq('zip')
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should include top-level options that are marked as :authorize_options' do
|
18
|
+
@options = { :authorize_options => [:scope, :foo], :scope => 'bar', :foo => 'baz' }
|
19
|
+
subject.authorize_params['scope'].should eq('bar')
|
20
|
+
subject.authorize_params['foo'].should eq('baz')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#token_params' do
|
25
|
+
it 'should include any authorize params passed in the :authorize_params option' do
|
26
|
+
@options = { :token_params => { :foo => 'bar', :baz => 'zip' } }
|
27
|
+
subject.token_params['foo'].should eq('bar')
|
28
|
+
subject.token_params['baz'].should eq('zip')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should include top-level options that are marked as :authorize_options' do
|
32
|
+
@options = { :token_options => [:scope, :foo], :scope => 'bar', :foo => 'baz' }
|
33
|
+
subject.token_params['scope'].should eq('bar')
|
34
|
+
subject.token_params['foo'].should eq('baz')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: omniauth-taskrabbit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jean-Richard Lai
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: omniauth-oauth2
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.0.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.2
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '2'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description:
|
63
|
+
email:
|
64
|
+
- jrichardlai@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- Gemfile
|
71
|
+
- README.md
|
72
|
+
- Rakefile
|
73
|
+
- examples/config.ru
|
74
|
+
- examples/omni_auth.rb
|
75
|
+
- lib/omniauth-taskrabbit.rb
|
76
|
+
- lib/omniauth/strategies/taskrabbit.rb
|
77
|
+
- lib/omniauth/taskrabbit.rb
|
78
|
+
- lib/omniauth/taskrabbit/version.rb
|
79
|
+
- omniauth-taskrabbit.gemspec
|
80
|
+
- spec/omniauth/strategies/taskrabbit_spec.rb
|
81
|
+
- spec/spec_helper.rb
|
82
|
+
- spec/support/shared_examples.rb
|
83
|
+
homepage: https://github.com/jrichardlai/omniauth-taskrabbit
|
84
|
+
licenses: []
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
segments:
|
96
|
+
- 0
|
97
|
+
hash: -844660181069885661
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
hash: -844660181069885661
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 1.8.24
|
110
|
+
signing_key:
|
111
|
+
specification_version: 3
|
112
|
+
summary: Taskrabbit strategy for OmniAuth
|
113
|
+
test_files:
|
114
|
+
- spec/omniauth/strategies/taskrabbit_spec.rb
|
115
|
+
- spec/spec_helper.rb
|
116
|
+
- spec/support/shared_examples.rb
|