oa-more 0.2.6 → 0.3.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/lib/omniauth/more.rb +4 -4
- data/lib/omniauth/strategies/last_fm.rb +93 -0
- data/lib/omniauth/version.rb +3 -3
- data/oa-more.gemspec +13 -15
- data/spec/omniauth/strategies/{flickr_spec.rb → last_fm_spec.rb} +2 -2
- metadata +79 -26
- data/lib/omniauth/strategies/flickr.rb +0 -86
data/Gemfile
CHANGED
data/lib/omniauth/more.rb
CHANGED
@@ -2,10 +2,10 @@ require 'omniauth/core'
|
|
2
2
|
|
3
3
|
module OmniAuth
|
4
4
|
module Strategies
|
5
|
+
autoload :Draugiem, 'omniauth/strategies/draugiem'
|
6
|
+
autoload :Ign, 'omniauth/strategies/ign'
|
7
|
+
autoload :LastFm, 'omniauth/strategies/last_fm'
|
5
8
|
autoload :WindowsLive, 'omniauth/strategies/windows_live'
|
6
|
-
autoload :
|
7
|
-
autoload :Yupoo, 'omniauth/strategies/yupoo'
|
8
|
-
autoload :Ign, 'omniauth/strategies/ign'
|
9
|
-
autoload :Draugiem, 'omniauth/strategies/draugiem'
|
9
|
+
autoload :Yupoo, 'omniauth/strategies/yupoo'
|
10
10
|
end
|
11
11
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'omniauth/core'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'rest-client'
|
4
|
+
require 'multi_json'
|
5
|
+
|
6
|
+
module OmniAuth
|
7
|
+
module Strategies
|
8
|
+
#
|
9
|
+
# Authenticate to LastFM
|
10
|
+
#
|
11
|
+
# @example Basic Usage
|
12
|
+
#
|
13
|
+
# use OmniAuth::Strategies::LastFm, 'API Key', 'Secret Key'
|
14
|
+
class LastFm
|
15
|
+
include OmniAuth::Strategy
|
16
|
+
attr_accessor :api_key, :secret_key, :options
|
17
|
+
|
18
|
+
# error catching, based on OAuth2 callback
|
19
|
+
class CallbackError < StandardError
|
20
|
+
attr_accessor :error, :error_reason
|
21
|
+
def initialize(error, error_reason)
|
22
|
+
self.error = error
|
23
|
+
self.error_reason = error_reason
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param [Rack Application] app standard middleware application parameter
|
28
|
+
# @param [String] api_key the application id as [registered on LastFM](http://www.last.fm/api/account)
|
29
|
+
# @param [String] secret_key the application secret as [registered on LastFM](http://www.last.fm/api/account)
|
30
|
+
# @option options, You can optionally specify a callback URL that is different to your API Account callback url. Include this as a query param cb
|
31
|
+
def initialize(app, api_key, secret_key, options = {})
|
32
|
+
super(app, :last_fm)
|
33
|
+
@api_key = api_key
|
34
|
+
@secret_key = secret_key
|
35
|
+
@options = options
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def request_phase
|
41
|
+
params = { :api_key => api_key, :cb => options[:cb] }
|
42
|
+
query_string = params.collect{ |key,value| "#{key}=#{Rack::Utils.escape(value)}" }.join('&')
|
43
|
+
redirect "http://www.last.fm/api/auth/?#{query_string}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def callback_phase
|
47
|
+
token = request.params['token']
|
48
|
+
params = { :api_key => api_key, :method => 'auth.getSession', :format => 'json' }
|
49
|
+
params[:token] = token
|
50
|
+
params[:api_sig] = signature(token)
|
51
|
+
|
52
|
+
response = RestClient.get('http://ws.audioscrobbler.com/2.0/', { :params => params })
|
53
|
+
@auth = MultiJson.decode(response.to_s)
|
54
|
+
raise CallbackError.new(@auth['error'],@auth['message']) if @auth['error']
|
55
|
+
|
56
|
+
user_params = { :method => "user.getInfo", :user => @auth['session']['name'], :api_key => api_key, :format => "json" }
|
57
|
+
user_response = RestClient.get('http://ws.audioscrobbler.com/2.0/', { :params => user_params })
|
58
|
+
@user_auth = MultiJson.decode(user_response.to_s)
|
59
|
+
raise CallbackError.new(@user_auth['error'],@user_auth['message']) if @user_auth['error']
|
60
|
+
|
61
|
+
super
|
62
|
+
rescue CallbackError => e
|
63
|
+
fail!(:invalid_response, e)
|
64
|
+
end
|
65
|
+
|
66
|
+
def auth_hash
|
67
|
+
OmniAuth::Utils.deep_merge(super, {
|
68
|
+
'uid' => @user_auth['user']['id'],
|
69
|
+
'credentials' => { 'token' => @auth['session']['key'] },
|
70
|
+
'user_info' => user_info,
|
71
|
+
'extra' => { 'user_hash' => @user_auth }
|
72
|
+
})
|
73
|
+
end
|
74
|
+
|
75
|
+
def user_info
|
76
|
+
{
|
77
|
+
'name' => @user_auth['user']['realname'],
|
78
|
+
'nickname' => @user_auth['user']['name'],
|
79
|
+
'location' => @user_auth['user']['country'],
|
80
|
+
'image' => @user_auth['user']['image'],
|
81
|
+
'urls' => {
|
82
|
+
'Profile' => @user_auth['user']['url']
|
83
|
+
}
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
def signature(token)
|
88
|
+
sign = "api_key#{api_key}methodauth.getSessiontoken#{token}#{secret_key}"
|
89
|
+
Digest::MD5.hexdigest(sign)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/omniauth/version.rb
CHANGED
@@ -4,13 +4,13 @@ module OmniAuth
|
|
4
4
|
MAJOR = 0
|
5
5
|
end
|
6
6
|
unless defined?(::OmniAuth::Version::MINOR)
|
7
|
-
MINOR =
|
7
|
+
MINOR = 3
|
8
8
|
end
|
9
9
|
unless defined?(::OmniAuth::Version::PATCH)
|
10
|
-
PATCH =
|
10
|
+
PATCH = 0
|
11
11
|
end
|
12
12
|
unless defined?(::OmniAuth::Version::PRE)
|
13
|
-
PRE =
|
13
|
+
PRE = "rc3"
|
14
14
|
end
|
15
15
|
unless defined?(::OmniAuth::Version::STRING)
|
16
16
|
STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
data/oa-more.gemspec
CHANGED
@@ -1,29 +1,27 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
require File.expand_path('../lib/omniauth/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.
|
6
|
-
gem.
|
7
|
-
gem.
|
5
|
+
gem.add_dependency 'multi_json', '~> 1.0.0'
|
6
|
+
gem.add_dependency 'oa-core', OmniAuth::Version::STRING
|
7
|
+
gem.add_dependency 'rest-client', '~> 1.6.0'
|
8
8
|
gem.add_development_dependency 'json_pure', '~> 1.5'
|
9
|
-
gem.add_development_dependency 'maruku', '~> 0.6'
|
10
|
-
gem.add_development_dependency 'rake', '~> 0.8'
|
11
9
|
gem.add_development_dependency 'rack-test', '~> 0.5'
|
10
|
+
gem.add_development_dependency 'rake', '~> 0.8'
|
11
|
+
gem.add_development_dependency 'rdiscount', '~> 1.6'
|
12
12
|
gem.add_development_dependency 'rspec', '~> 2.5'
|
13
13
|
gem.add_development_dependency 'simplecov', '~> 0.4'
|
14
|
-
gem.add_development_dependency 'webmock', '~> 1.
|
14
|
+
gem.add_development_dependency 'webmock', '~> 1.7'
|
15
15
|
gem.add_development_dependency 'yard', '~> 0.7'
|
16
|
-
gem.
|
17
|
-
gem.name = 'oa-more'
|
18
|
-
gem.version = OmniAuth::Version::STRING
|
16
|
+
gem.authors = ['Michael Bleigh', 'Erik Michaels-Ober']
|
19
17
|
gem.description = %q{Additional strategies for OmniAuth.}
|
20
|
-
gem.summary = gem.description
|
21
18
|
gem.email = 'michael@intridea.com'
|
22
|
-
gem.homepage = 'http://github.com/intridea/omniauth'
|
23
|
-
gem.authors = ['Michael Bleigh', 'Erik Michaels-Ober']
|
24
|
-
gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
|
25
19
|
gem.files = `git ls-files`.split("\n")
|
26
|
-
gem.
|
20
|
+
gem.homepage = 'http://github.com/intridea/omniauth'
|
21
|
+
gem.name = 'oa-more'
|
27
22
|
gem.require_paths = ['lib']
|
28
23
|
gem.required_rubygems_version = Gem::Requirement.new('>= 1.3.6') if gem.respond_to? :required_rubygems_version=
|
24
|
+
gem.summary = gem.description
|
25
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
26
|
+
gem.version = OmniAuth::Version::STRING
|
29
27
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../../../spec_helper', __FILE__)
|
2
2
|
|
3
|
-
describe 'OmniAuth::Strategies::
|
3
|
+
describe 'OmniAuth::Strategies::LastFm' do
|
4
4
|
it 'should initialize with a consumer key and secret' do
|
5
|
-
lambda{OmniAuth::Strategies::
|
5
|
+
lambda{OmniAuth::Strategies::LastFm.new({},'abc','def')}.should_not raise_error
|
6
6
|
end
|
7
7
|
end
|
metadata
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oa-more
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: 15424035
|
5
|
+
prerelease: 6
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
- rc
|
11
|
+
- 3
|
12
|
+
version: 0.3.0.rc3
|
6
13
|
platform: ruby
|
7
14
|
authors:
|
8
15
|
- Michael Bleigh
|
@@ -11,7 +18,7 @@ autorequire:
|
|
11
18
|
bindir: bin
|
12
19
|
cert_chain: []
|
13
20
|
|
14
|
-
date: 2011-
|
21
|
+
date: 2011-09-03 00:00:00 Z
|
15
22
|
dependencies:
|
16
23
|
- !ruby/object:Gem::Dependency
|
17
24
|
name: multi_json
|
@@ -21,6 +28,11 @@ dependencies:
|
|
21
28
|
requirements:
|
22
29
|
- - ~>
|
23
30
|
- !ruby/object:Gem::Version
|
31
|
+
hash: 23
|
32
|
+
segments:
|
33
|
+
- 1
|
34
|
+
- 0
|
35
|
+
- 0
|
24
36
|
version: 1.0.0
|
25
37
|
type: :runtime
|
26
38
|
version_requirements: *id001
|
@@ -32,7 +44,14 @@ dependencies:
|
|
32
44
|
requirements:
|
33
45
|
- - "="
|
34
46
|
- !ruby/object:Gem::Version
|
35
|
-
|
47
|
+
hash: 15424035
|
48
|
+
segments:
|
49
|
+
- 0
|
50
|
+
- 3
|
51
|
+
- 0
|
52
|
+
- rc
|
53
|
+
- 3
|
54
|
+
version: 0.3.0.rc3
|
36
55
|
type: :runtime
|
37
56
|
version_requirements: *id002
|
38
57
|
- !ruby/object:Gem::Dependency
|
@@ -43,6 +62,11 @@ dependencies:
|
|
43
62
|
requirements:
|
44
63
|
- - ~>
|
45
64
|
- !ruby/object:Gem::Version
|
65
|
+
hash: 15
|
66
|
+
segments:
|
67
|
+
- 1
|
68
|
+
- 6
|
69
|
+
- 0
|
46
70
|
version: 1.6.0
|
47
71
|
type: :runtime
|
48
72
|
version_requirements: *id003
|
@@ -54,18 +78,26 @@ dependencies:
|
|
54
78
|
requirements:
|
55
79
|
- - ~>
|
56
80
|
- !ruby/object:Gem::Version
|
81
|
+
hash: 5
|
82
|
+
segments:
|
83
|
+
- 1
|
84
|
+
- 5
|
57
85
|
version: "1.5"
|
58
86
|
type: :development
|
59
87
|
version_requirements: *id004
|
60
88
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
89
|
+
name: rack-test
|
62
90
|
prerelease: false
|
63
91
|
requirement: &id005 !ruby/object:Gem::Requirement
|
64
92
|
none: false
|
65
93
|
requirements:
|
66
94
|
- - ~>
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
|
96
|
+
hash: 1
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
- 5
|
100
|
+
version: "0.5"
|
69
101
|
type: :development
|
70
102
|
version_requirements: *id005
|
71
103
|
- !ruby/object:Gem::Dependency
|
@@ -76,18 +108,26 @@ dependencies:
|
|
76
108
|
requirements:
|
77
109
|
- - ~>
|
78
110
|
- !ruby/object:Gem::Version
|
111
|
+
hash: 27
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
- 8
|
79
115
|
version: "0.8"
|
80
116
|
type: :development
|
81
117
|
version_requirements: *id006
|
82
118
|
- !ruby/object:Gem::Dependency
|
83
|
-
name:
|
119
|
+
name: rdiscount
|
84
120
|
prerelease: false
|
85
121
|
requirement: &id007 !ruby/object:Gem::Requirement
|
86
122
|
none: false
|
87
123
|
requirements:
|
88
124
|
- - ~>
|
89
125
|
- !ruby/object:Gem::Version
|
90
|
-
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 1
|
129
|
+
- 6
|
130
|
+
version: "1.6"
|
91
131
|
type: :development
|
92
132
|
version_requirements: *id007
|
93
133
|
- !ruby/object:Gem::Dependency
|
@@ -98,6 +138,10 @@ dependencies:
|
|
98
138
|
requirements:
|
99
139
|
- - ~>
|
100
140
|
- !ruby/object:Gem::Version
|
141
|
+
hash: 9
|
142
|
+
segments:
|
143
|
+
- 2
|
144
|
+
- 5
|
101
145
|
version: "2.5"
|
102
146
|
type: :development
|
103
147
|
version_requirements: *id008
|
@@ -109,6 +153,10 @@ dependencies:
|
|
109
153
|
requirements:
|
110
154
|
- - ~>
|
111
155
|
- !ruby/object:Gem::Version
|
156
|
+
hash: 3
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
- 4
|
112
160
|
version: "0.4"
|
113
161
|
type: :development
|
114
162
|
version_requirements: *id009
|
@@ -120,7 +168,11 @@ dependencies:
|
|
120
168
|
requirements:
|
121
169
|
- - ~>
|
122
170
|
- !ruby/object:Gem::Version
|
123
|
-
|
171
|
+
hash: 1
|
172
|
+
segments:
|
173
|
+
- 1
|
174
|
+
- 7
|
175
|
+
version: "1.7"
|
124
176
|
type: :development
|
125
177
|
version_requirements: *id010
|
126
178
|
- !ruby/object:Gem::Dependency
|
@@ -131,20 +183,13 @@ dependencies:
|
|
131
183
|
requirements:
|
132
184
|
- - ~>
|
133
185
|
- !ruby/object:Gem::Version
|
186
|
+
hash: 5
|
187
|
+
segments:
|
188
|
+
- 0
|
189
|
+
- 7
|
134
190
|
version: "0.7"
|
135
191
|
type: :development
|
136
192
|
version_requirements: *id011
|
137
|
-
- !ruby/object:Gem::Dependency
|
138
|
-
name: ZenTest
|
139
|
-
prerelease: false
|
140
|
-
requirement: &id012 !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
|
-
requirements:
|
143
|
-
- - ~>
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: "4.5"
|
146
|
-
type: :development
|
147
|
-
version_requirements: *id012
|
148
193
|
description: Additional strategies for OmniAuth.
|
149
194
|
email: michael@intridea.com
|
150
195
|
executables: []
|
@@ -164,15 +209,15 @@ files:
|
|
164
209
|
- lib/oa-more.rb
|
165
210
|
- lib/omniauth/more.rb
|
166
211
|
- lib/omniauth/strategies/draugiem.rb
|
167
|
-
- lib/omniauth/strategies/flickr.rb
|
168
212
|
- lib/omniauth/strategies/ign.rb
|
213
|
+
- lib/omniauth/strategies/last_fm.rb
|
169
214
|
- lib/omniauth/strategies/windows_live.rb
|
170
215
|
- lib/omniauth/strategies/windows_live/windowslivelogin.rb
|
171
216
|
- lib/omniauth/strategies/yupoo.rb
|
172
217
|
- lib/omniauth/version.rb
|
173
218
|
- oa-more.gemspec
|
174
219
|
- spec/omniauth/strategies/draugiem_spec.rb
|
175
|
-
- spec/omniauth/strategies/
|
220
|
+
- spec/omniauth/strategies/last_fm_spec.rb
|
176
221
|
- spec/spec_helper.rb
|
177
222
|
homepage: http://github.com/intridea/omniauth
|
178
223
|
licenses: []
|
@@ -187,21 +232,29 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
187
232
|
requirements:
|
188
233
|
- - ">="
|
189
234
|
- !ruby/object:Gem::Version
|
235
|
+
hash: 3
|
236
|
+
segments:
|
237
|
+
- 0
|
190
238
|
version: "0"
|
191
239
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
240
|
none: false
|
193
241
|
requirements:
|
194
|
-
- - "
|
242
|
+
- - ">"
|
195
243
|
- !ruby/object:Gem::Version
|
196
|
-
|
244
|
+
hash: 25
|
245
|
+
segments:
|
246
|
+
- 1
|
247
|
+
- 3
|
248
|
+
- 1
|
249
|
+
version: 1.3.1
|
197
250
|
requirements: []
|
198
251
|
|
199
252
|
rubyforge_project:
|
200
|
-
rubygems_version: 1.8.
|
253
|
+
rubygems_version: 1.8.10
|
201
254
|
signing_key:
|
202
255
|
specification_version: 3
|
203
256
|
summary: Additional strategies for OmniAuth.
|
204
257
|
test_files:
|
205
258
|
- spec/omniauth/strategies/draugiem_spec.rb
|
206
|
-
- spec/omniauth/strategies/
|
259
|
+
- spec/omniauth/strategies/last_fm_spec.rb
|
207
260
|
- spec/spec_helper.rb
|
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'omniauth/core'
|
2
|
-
require 'digest/md5'
|
3
|
-
require 'rest-client'
|
4
|
-
require 'multi_json'
|
5
|
-
|
6
|
-
module OmniAuth
|
7
|
-
module Strategies
|
8
|
-
#
|
9
|
-
# Authenticate to Flickr
|
10
|
-
#
|
11
|
-
# @example Basic Usage
|
12
|
-
#
|
13
|
-
# use OmniAuth::Strategies::Flickr, 'API Key', 'Secret Key', :scope => 'read'
|
14
|
-
class Flickr
|
15
|
-
include OmniAuth::Strategy
|
16
|
-
attr_accessor :api_key, :secret_key, :options
|
17
|
-
|
18
|
-
# error catching, based on OAuth2 callback
|
19
|
-
class CallbackError < StandardError
|
20
|
-
attr_accessor :error, :error_reason
|
21
|
-
def initialize(error, error_reason)
|
22
|
-
self.error = error
|
23
|
-
self.error_reason = error_reason
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# @param [Rack Application] app standard middleware application parameter
|
28
|
-
# @param [String] api_key the application id as [registered on Flickr](http://www.flickr.com/services/apps/)
|
29
|
-
# @param [String] secret_key the application secret as [registered on Flickr](http://www.flickr.com/services/apps/)
|
30
|
-
# @option options ['read','write','delete] :scope ('read') the scope of your authorization request; must be `read` or 'write' or 'delete'
|
31
|
-
def initialize(app, api_key, secret_key, options = {})
|
32
|
-
super(app, :flickr)
|
33
|
-
@api_key = api_key
|
34
|
-
@secret_key = secret_key
|
35
|
-
@options = {:scope => 'read'}.merge(options)
|
36
|
-
end
|
37
|
-
|
38
|
-
protected
|
39
|
-
|
40
|
-
def request_phase
|
41
|
-
params = { :api_key => api_key, :perms => options[:scope] }
|
42
|
-
params[:api_sig] = flickr_sign(params)
|
43
|
-
query_string = params.collect{ |key,value| "#{key}=#{Rack::Utils.escape(value)}" }.join('&')
|
44
|
-
redirect "http://flickr.com/services/auth/?#{query_string}"
|
45
|
-
end
|
46
|
-
|
47
|
-
def callback_phase
|
48
|
-
params = { :api_key => api_key, :method => 'flickr.auth.getToken', :frob => request.params['frob'], :format => 'json', :nojsoncallback => '1' }
|
49
|
-
params[:api_sig] = flickr_sign(params)
|
50
|
-
|
51
|
-
response = RestClient.get('http://api.flickr.com/services/rest/', { :params => params })
|
52
|
-
auth = MultiJson.decode(response.to_s)
|
53
|
-
raise CallbackError.new(auth['code'],auth['message']) if auth['stat'] == 'fail'
|
54
|
-
|
55
|
-
@user = auth['auth']['user']
|
56
|
-
@access_token = auth['auth']['token']['_content']
|
57
|
-
|
58
|
-
super
|
59
|
-
rescue CallbackError => e
|
60
|
-
fail!(:invalid_response, e)
|
61
|
-
end
|
62
|
-
|
63
|
-
def auth_hash
|
64
|
-
OmniAuth::Utils.deep_merge(super, {
|
65
|
-
'uid' => @user['nsid'],
|
66
|
-
'credentials' => { 'token' => @access_token },
|
67
|
-
'user_info' => user_info,
|
68
|
-
'extra' => { 'user_hash' => @user }
|
69
|
-
})
|
70
|
-
end
|
71
|
-
|
72
|
-
def user_info
|
73
|
-
name = @user['fullname']
|
74
|
-
name = @user['username'] if name.nil? || name.empty?
|
75
|
-
{
|
76
|
-
'nickname' => @user['username'],
|
77
|
-
'name' => name,
|
78
|
-
}
|
79
|
-
end
|
80
|
-
|
81
|
-
def flickr_sign(params)
|
82
|
-
Digest::MD5.hexdigest(secret_key + params.sort{|a,b| a[0].to_s <=> b[0].to_s }.flatten.join)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|