oauth2-client 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +10 -0
- data/.travis.yml +1 -0
- data/Gemfile +7 -12
- data/Gemfile.lock +17 -9
- data/{LICENSE → LICENSE.md} +1 -1
- data/README.md +109 -19
- data/examples/github_client.rb +42 -0
- data/examples/google_client.rb +17 -15
- data/examples/yammer_client.rb +96 -0
- data/lib/oauth2/client.rb +12 -0
- data/lib/oauth2/connection.rb +8 -12
- data/lib/oauth2/grant/authorization_code.rb +7 -8
- data/lib/oauth2/version.rb +1 -1
- data/oauth2-client.gemspec +23 -13
- data/spec/examples/github_client_spec.rb +59 -0
- data/spec/examples/google_client_spec.rb +54 -78
- data/spec/examples/yammer_client_spec.rb +75 -0
- data/spec/oauth2/client_spec.rb +4 -4
- data/spec/oauth2/connection_spec.rb +56 -43
- data/spec/oauth2/grant/authorization_code_spec.rb +7 -2
- data/spec/oauth2/grant/client_credentials_spec.rb +4 -1
- data/spec/oauth2/grant/device_spec.rb +7 -2
- data/spec/oauth2/grant/implicit_spec.rb +4 -1
- data/spec/oauth2/grant/password_spec.rb +4 -1
- data/spec/oauth2/grant/refresh_token_spec.rb +4 -1
- data/spec/spec_helper.rb +18 -1
- metadata +73 -18
- data/TODO +0 -10
- data/spec/.DS_Store +0 -0
- data/spec/mocks/oauth_client.yml +0 -60
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
N2U2ZjkyMjc5YjBhZWE1MjE3YTZjZDEzMjM4M2Y0MDZlYTA3MmU0YQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
M2NhZDBhYjljNzVmY2ZkYTEwNjcxZGI4MmRjNTUxODhhOTNlMzYzMQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzJhY2RiOWQ4ZWFkZTZjNmI2YmRhYWYyOGUzZTBiM2YzNmJmZWY0ZTgyZTRj
|
10
|
+
M2IwYTkyOTgxM2MzZmQ1MzhlODYyOGM4YjEwZGJhZWZkNDg3ZDA4YzEyNWVk
|
11
|
+
NDQxNWM0N2QzYjRiZmM2Y2UwMzc4MzRlOTQ1OGQ2YjBjNTk5NTg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZGU0YmRiM2Y5YjRlNzUzMTdmNTA0ZWVjOGIzMzViNDliNzQxNjk0OWNiN2Zj
|
14
|
+
MDVjYjYxYzUxYTRiN2I0ZDJjYjQxZDc0YmEyZmI4ZWQ4YjFhNjMwYjVlMTcy
|
15
|
+
YzUwNGFjNDlmZDM4YjU1ODVlMDc1MGIzMDE5ZTViYmU3YTNjNjY=
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,17 +1,12 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'json'
|
4
|
-
|
5
|
-
gem 'bcrypt-ruby', '~> 3.0.0'
|
6
|
-
|
7
|
-
gem 'addressable'
|
8
|
-
|
9
3
|
gem 'rake'
|
10
4
|
|
11
|
-
|
12
|
-
|
13
|
-
gem '
|
14
|
-
|
15
|
-
gem '
|
5
|
+
group :test do
|
6
|
+
gem 'json', :platforms => :ruby_18
|
7
|
+
gem 'rspec', '>= 2.11'
|
8
|
+
gem 'simplecov', :require => false
|
9
|
+
gem 'webmock'
|
10
|
+
end
|
16
11
|
|
17
|
-
|
12
|
+
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
oauth2-client (1.1.0)
|
5
|
+
addressable
|
6
|
+
bcrypt-ruby (~> 3.0.0)
|
7
|
+
json
|
8
|
+
|
1
9
|
GEM
|
2
10
|
remote: https://rubygems.org/
|
3
11
|
specs:
|
4
|
-
|
5
|
-
i18n (~> 0.6)
|
6
|
-
multi_json (~> 1.0)
|
7
|
-
addressable (2.3.2)
|
12
|
+
addressable (2.3.3)
|
8
13
|
bcrypt-ruby (3.0.1)
|
14
|
+
crack (0.3.2)
|
9
15
|
diff-lcs (1.1.3)
|
10
|
-
i18n (0.6.1)
|
11
16
|
json (1.7.5)
|
12
17
|
multi_json (1.3.6)
|
13
18
|
rake (0.9.2.2)
|
@@ -23,15 +28,18 @@ GEM
|
|
23
28
|
multi_json (~> 1.0)
|
24
29
|
simplecov-html (~> 0.7.1)
|
25
30
|
simplecov-html (0.7.1)
|
31
|
+
webmock (1.10.1)
|
32
|
+
addressable (>= 2.2.7)
|
33
|
+
crack (>= 0.3.2)
|
26
34
|
|
27
35
|
PLATFORMS
|
28
36
|
ruby
|
29
37
|
|
30
38
|
DEPENDENCIES
|
31
|
-
|
32
|
-
addressable
|
33
|
-
bcrypt-ruby (~> 3.0.0)
|
39
|
+
bundler (~> 1.0)
|
34
40
|
json
|
41
|
+
oauth2-client!
|
35
42
|
rake
|
36
|
-
rspec (
|
43
|
+
rspec (>= 2.11)
|
37
44
|
simplecov
|
45
|
+
webmock
|
data/{LICENSE → LICENSE.md}
RENAMED
data/README.md
CHANGED
@@ -1,24 +1,30 @@
|
|
1
1
|
# OAuth2 Ruby Client
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/oauth2-client.png)][gem]
|
3
4
|
[![Build Status](https://secure.travis-ci.org/tiabas/oauth2-client.png?branch=master)][travis]
|
4
5
|
|
6
|
+
[gem]: https://rubygems.org/gems/oauth2-client
|
5
7
|
[travis]: http://travis-ci.org/tiabas/oauth2-client
|
6
8
|
|
7
|
-
A Ruby wrapper for the OAuth 2.0 specification. It is designed with the philosophy that
|
8
|
-
|
9
|
-
[
|
10
|
-
the developer some degree of flexibility in
|
11
|
-
|
9
|
+
A Ruby wrapper for the OAuth 2.0 specification. It is designed with the philosophy that
|
10
|
+
different service providers implement OAuth 2.0 differently and not exactly according to the
|
11
|
+
[RFC]( http://tools.ietf.org/html/rfc6749). This gem therefore, affords
|
12
|
+
the developer some degree of flexibility in creating a client that will work with different OAuth2
|
13
|
+
providers.
|
12
14
|
|
13
|
-
For more about the standard
|
15
|
+
For more about the standard checkout: http://tools.ietf.org/html/rfc6749
|
14
16
|
|
15
17
|
## Installation
|
16
|
-
|
18
|
+
```sh
|
19
|
+
gem install oauth2-client
|
20
|
+
```
|
17
21
|
|
18
22
|
## Resources
|
19
23
|
* [View Source on GitHub][code]
|
20
24
|
* [Report Issues on GitHub][issues]
|
25
|
+
* [Website][website]
|
21
26
|
|
27
|
+
[website]: http://tiabas.github.com/oauth2-client/
|
22
28
|
[code]: https://github.com/tiabas/oauth2-client
|
23
29
|
[issues]: https://github.com/tiabas/oauth2-client/issues
|
24
30
|
|
@@ -85,6 +91,52 @@ auth_url = client.device_code.authorization_path(:scope => 'abc xyz', :state =>
|
|
85
91
|
token = client.device_code.get_token(device_auth_code)
|
86
92
|
```
|
87
93
|
|
94
|
+
# Using a custom Http wrapper
|
95
|
+
By default, oauth2-client uses a Net::HTTP wrapper called OAuth2::HttpConnection. However, if you wish to use a different HTTP library, you only
|
96
|
+
need to create a wrapper around your favorite library that will respond to the `send_request` method.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
class TyphoeusHttpConnection
|
100
|
+
|
101
|
+
def initalize(site_url, connection_options={})
|
102
|
+
# set url and connection options
|
103
|
+
@site_url = site_url
|
104
|
+
@connection_options = connection_options
|
105
|
+
end
|
106
|
+
|
107
|
+
def base_url(path)
|
108
|
+
@site_url + path
|
109
|
+
end
|
110
|
+
|
111
|
+
def send_request(http_method, request_path, options={})
|
112
|
+
# options may contain optional arguments like http headers, request parameters etc
|
113
|
+
# send http request over the inter-webs
|
114
|
+
|
115
|
+
params = options[:params] || {}
|
116
|
+
headers = options[:headers]|| {}
|
117
|
+
method = method.to_sym
|
118
|
+
client = Typhoeus
|
119
|
+
|
120
|
+
case method
|
121
|
+
when :get, :delete
|
122
|
+
#pass
|
123
|
+
when :post, :put
|
124
|
+
options[:body] = options.delete(:params) if options[:params]
|
125
|
+
else
|
126
|
+
raise UnhandledHTTPMethodError.new("Unsupported HTTP method, #{method}")
|
127
|
+
end
|
128
|
+
response = client.send(http_method, base_url(request_path), params)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# now you can initialize the OAuth2 client with you custom client and expect that all requests
|
133
|
+
# will be sent using this client
|
134
|
+
oauth_client = OAuth2::Client.new('example.com', client_id, client_secret, {
|
135
|
+
:connection_client => TyphoeusHttpConnection,
|
136
|
+
:connection_options => {}
|
137
|
+
})
|
138
|
+
```
|
139
|
+
|
88
140
|
# Client Examples
|
89
141
|
This library comes bundled with two sample implementations of Google and Yammer OAuth clients. These clients are
|
90
142
|
meant to showcase the degree of flexibilty that you get when using this library to interact with other OAuth 2.0
|
@@ -94,21 +146,14 @@ providers.
|
|
94
146
|
|
95
147
|
```ruby
|
96
148
|
|
97
|
-
google_client = GoogleClient.new(
|
98
|
-
'https://accounts.google.com',
|
99
|
-
'827502413694.apps.googleusercontent.com',
|
100
|
-
'a2nQpcUm2Dgq1chWdAvbXGTk',
|
101
|
-
{
|
102
|
-
:token_path => '/o/oauth2/token',
|
103
|
-
:authorize_path => '/o/oauth2/auth',
|
104
|
-
:device_path => '/o/oauth2/device/code'
|
105
|
-
}
|
106
|
-
)
|
149
|
+
google_client = GoogleClient.new('https://accounts.google.com', '827502413694.apps.googleusercontent.com','a2nQpcUm2Dgq1chWdAvbXGTk')
|
107
150
|
|
108
151
|
```
|
109
152
|
|
110
153
|
### Client-side authorization URL(Implicit grant)
|
111
154
|
```ruby
|
155
|
+
|
156
|
+
# generate authorization url
|
112
157
|
auth_url = google_client.webserver_authorization_url(
|
113
158
|
:scope => 'https://www.googleapis.com/auth/userinfo.email',
|
114
159
|
:state => '/profile',
|
@@ -119,6 +164,8 @@ auth_url = google_client.webserver_authorization_url(
|
|
119
164
|
|
120
165
|
### Server-side authorization URL(Authorization code grant)
|
121
166
|
```ruby
|
167
|
+
|
168
|
+
# generate authorization url
|
122
169
|
auth_url = google_client.clientside_authorization_url(
|
123
170
|
:scope => 'https://www.googleapis.com/auth/userinfo.email',
|
124
171
|
:state => '/profile',
|
@@ -146,7 +193,50 @@ response.body
|
|
146
193
|
}
|
147
194
|
```
|
148
195
|
|
196
|
+
## Github Client
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
|
200
|
+
gihub_client = GithubClient.new('https://github.com', '82f971d013e8d637a7e1', '1a1d59e1f8b8afa5f73e9dc9f17e25f7876e64ac')
|
201
|
+
|
202
|
+
```
|
203
|
+
### Server-side authorization URL(Authorization code grant)
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
|
207
|
+
# generate authorization url
|
208
|
+
auth_url = gihub_client.webserver_authorization_url
|
209
|
+
# => https://github.com/login/oauth/authorize?client_id=82f971d013e8d637a7e1&response_type=code
|
210
|
+
|
211
|
+
# exchange authorization code for access token. we will get back a Net::HTTPResponse
|
212
|
+
response = gihub_client.exchange_auth_code_for_token({
|
213
|
+
:code => '11a0b0b64db56c30e2ef',
|
214
|
+
:redirect_uri => 'https://localhost/callback',
|
215
|
+
})
|
216
|
+
|
217
|
+
response.inspect
|
218
|
+
# => #<Net::HTTPOK:0x007ff8bc7c1200>
|
219
|
+
|
220
|
+
response.body
|
221
|
+
# => {
|
222
|
+
"access_token" : "e409f4272fe539166a77c42479de030e7660812a",
|
223
|
+
"token_type" : "bearer"
|
224
|
+
}"
|
225
|
+
```
|
226
|
+
|
227
|
+
## Supported Ruby Versions
|
228
|
+
This library aims to support and is [tested against][travis] the following Ruby
|
229
|
+
version:
|
230
|
+
|
231
|
+
* Ruby 1.8.7
|
232
|
+
* Ruby 1.9.2
|
233
|
+
* Ruby 1.9.3
|
234
|
+
|
235
|
+
This library may inadvertently work (or seem to work) on other Ruby
|
236
|
+
implementations, however support will only be provided for the versions listed
|
237
|
+
above.
|
238
|
+
|
149
239
|
## Copyright
|
150
|
-
Copyright (c)
|
151
|
-
See [LICENSE][] for details.
|
240
|
+
Copyright (c) 2013 Kevin Mutyaba
|
241
|
+
See [LICENSE][license] for details.
|
152
242
|
[license]: https://github.com/tiabas/oauth2-client/blob/master/LICENSE
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class GithubClient < OAuth2::Client
|
2
|
+
|
3
|
+
def initialize(*args)
|
4
|
+
super
|
5
|
+
@token_path = '/login/oauth/access_token'
|
6
|
+
@authorize_path = '/login/oauth/authorize'
|
7
|
+
end
|
8
|
+
# @see http://developer.github.com/v3/oauth/#redirect-users-to-request-github-access
|
9
|
+
#
|
10
|
+
# @params [Hash] parameters to include in the URL eg. scope, state, redirect_uri
|
11
|
+
#
|
12
|
+
# client.webserver_authorization_url({
|
13
|
+
# :scope => 'user, public_repo',
|
14
|
+
# :state => '2sw543v74sfD',
|
15
|
+
# :redirect_uri => 'https://localhost/callback',
|
16
|
+
# })
|
17
|
+
# #=>
|
18
|
+
def webserver_authorization_url(opts={})
|
19
|
+
opts[:scope] = normalize_scope(opts[:scope], ',') if opts[:scope]
|
20
|
+
authorization_code.authorization_url(opts)
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# @see http://developer.github.com/v3/oauth/#github-redirects-back-to-your-site
|
25
|
+
#
|
26
|
+
# @params [Hash] parameters to include in the URL eg. code, redirect_uri
|
27
|
+
#
|
28
|
+
# client.exchange_auth_code_for_token(
|
29
|
+
# :params => {
|
30
|
+
# :code => '11a0b0b64db56c30e2ef',
|
31
|
+
# :redirect_uri => 'https://localhost/callback',
|
32
|
+
# })
|
33
|
+
# #=>
|
34
|
+
def exchange_auth_code_for_token(opts={})
|
35
|
+
unless (opts[:params] && opts[:params][:code])
|
36
|
+
raise "Authorization code expected but was nil"
|
37
|
+
end
|
38
|
+
opts[:authenticate] = :body
|
39
|
+
code = opts[:params].delete(:code)
|
40
|
+
authorization_code.get_token(code, opts)
|
41
|
+
end
|
42
|
+
end
|
data/examples/google_client.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
class GoogleClient < OAuth2::Client
|
2
2
|
|
3
|
-
def
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
scope.join(sep)
|
3
|
+
def initialize(*args)
|
4
|
+
super
|
5
|
+
@token_path = '/o/oauth2/token'
|
6
|
+
@authorize_path = '/o/oauth2/auth'
|
7
|
+
@device_path = '/o/oauth2/device/code'
|
9
8
|
end
|
10
9
|
|
11
10
|
# Generates the Google URL that the user will be redirected to in order to
|
@@ -56,15 +55,6 @@ class GoogleClient < OAuth2::Client
|
|
56
55
|
authorization_code.authorization_url(params)
|
57
56
|
end
|
58
57
|
|
59
|
-
# Generates the Google URL that allows a user to obtain an authorization
|
60
|
-
# code for a given device
|
61
|
-
#
|
62
|
-
# @see https://developers.google.com/accounts/docs/OAuth2ForDevices
|
63
|
-
# def device_authorization_url(params={})
|
64
|
-
# params[:scope] = normalize_scope(params[:scope]) if params[:scope]
|
65
|
-
# device.authorization_url(params)
|
66
|
-
# end
|
67
|
-
|
68
58
|
# Makes a request to google server that will swap your authorization code for an access
|
69
59
|
# token
|
70
60
|
#
|
@@ -87,6 +77,7 @@ class GoogleClient < OAuth2::Client
|
|
87
77
|
unless (opts[:params] && opts[:params][:code])
|
88
78
|
raise ArgumentError.new("You must include an authorization code as a parameter")
|
89
79
|
end
|
80
|
+
opts[:authenticate] ||= :body
|
90
81
|
code = opts[:params].delete(:code)
|
91
82
|
authorization_code.get_token(code, opts)
|
92
83
|
end
|
@@ -112,10 +103,21 @@ class GoogleClient < OAuth2::Client
|
|
112
103
|
unless (opts[:params] && opts[:params][:refresh_token])
|
113
104
|
raise ArgumentError.new("You must provide a refresh_token as a parameter")
|
114
105
|
end
|
106
|
+
opts[:authenticate] = :body
|
115
107
|
token = opts[:params].delete(:refresh_token)
|
116
108
|
refresh_token.get_token(token, opts)
|
117
109
|
end
|
118
110
|
|
111
|
+
|
112
|
+
# Generates the Google URL that allows a user to obtain an authorization
|
113
|
+
# code for a given device
|
114
|
+
#
|
115
|
+
# @see https://developers.google.com/accounts/docs/OAuth2ForDevices
|
116
|
+
def device_authorization_url(params={})
|
117
|
+
params[:scope] = normalize_scope(params[:scope]) if params[:scope]
|
118
|
+
device.authorization_url(params)
|
119
|
+
end
|
120
|
+
|
119
121
|
# @see https://developers.google.com/accounts/docs/OAuth2ForDevices#obtainingacode
|
120
122
|
#
|
121
123
|
# @params [Hash] additional parameters to be include in URL eg. state
|
@@ -0,0 +1,96 @@
|
|
1
|
+
class YammerClient < OAuth2::Client
|
2
|
+
|
3
|
+
def initialize(*args)
|
4
|
+
super
|
5
|
+
@token_path = '/oauth2/token'
|
6
|
+
@authorize_path = '/dialog/oauth/authorize'
|
7
|
+
end
|
8
|
+
# Generates the Yammer URL that the user will be redirected to in order to
|
9
|
+
# authorize your application
|
10
|
+
#
|
11
|
+
# @see https://developer.yammer.com/api/oauth2.html#client-side
|
12
|
+
#
|
13
|
+
# @opts [Hash] additional parameters to be include in URL eg. scope, state, etc
|
14
|
+
#
|
15
|
+
# client = YammerClient.new(config)
|
16
|
+
# client.clientside_authorization_url({
|
17
|
+
# :redirect_uri => 'https://localhost/oauth/cb',
|
18
|
+
# })
|
19
|
+
# >> https://www.yammer.com/dialog/oauth/?client_id={client_id}&
|
20
|
+
# redirect_uri=http%3A%2F%2Flocalhost%2Foauth%2Fcb&response_type=token
|
21
|
+
#
|
22
|
+
def clientside_authorization_url(opts={})
|
23
|
+
implicit.token_url(opts)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Generates the Yammer URL that the user will be redirected to in order to
|
27
|
+
# authorize your application
|
28
|
+
#
|
29
|
+
# @see https://developer.yammer.com/api/oauth2.html#server-side
|
30
|
+
#
|
31
|
+
# @opts [Hash] additional parameters to be include in URL eg. scope, state, etc
|
32
|
+
#
|
33
|
+
# >> client = YammerClient.new(config)
|
34
|
+
# >> client.webserver_authorization_url({
|
35
|
+
# :redirect_uri => 'https://localhost/oauth/cb',
|
36
|
+
# })
|
37
|
+
# >> https://www.yammer.com/dialog/oauth/?client_id={client_id}&
|
38
|
+
# redirect_uri=http%3A%2F%2Flocalhost%2Foauth%2Fcb&response_type=code
|
39
|
+
#
|
40
|
+
def webserver_authorization_url(opts={})
|
41
|
+
opts[:scope] = normalize_scope(opts[:scope]) if opts[:scope]
|
42
|
+
authorization_code.authorization_url(opts)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Generates the Yammer URL that the user will be redirected to in order to
|
46
|
+
# authorize your application
|
47
|
+
#
|
48
|
+
# @see https://developer.yammer.com/api/oauth2.html#server-side
|
49
|
+
#
|
50
|
+
# @opts [Hash] additional parameters to be include in URL eg. scope, state, etc
|
51
|
+
#
|
52
|
+
# >> client = YammerClient.new(config)
|
53
|
+
# >> client.webserver_authorization_url({
|
54
|
+
# :client_secret => @client_secret
|
55
|
+
# :code => 'G3Y6jU3a',
|
56
|
+
# :redirect_uri => 'https://localhost/oauth/cb',
|
57
|
+
# })
|
58
|
+
# >> https://www.yammer.com/oauth2/access_token?client_id={client_id}&
|
59
|
+
# redirect_uri=http%3A%2F%2Flocalhost%2Foauth%2Fcb&client_secret={client_secret}&
|
60
|
+
# grant_type=authorization_code&code=aXW2c6bYz
|
61
|
+
#
|
62
|
+
def webserver_token_url(opts={})
|
63
|
+
opts[:scope] = normalize_scope(opts[:scope]) if opts[:scope]
|
64
|
+
opts[:client_secret] = @client_secret
|
65
|
+
authorization_code.token_path(opts)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Makes a request to Yammer server that will swap your authorization code for an access
|
69
|
+
# token
|
70
|
+
#
|
71
|
+
# @see https://developer.yammer.com/api/oauth2.html#server-side
|
72
|
+
#
|
73
|
+
# @opts [Hash] must include authorization code and redirect uri in additon to others
|
74
|
+
#
|
75
|
+
# >> client = YammerClient.new(config)
|
76
|
+
# >> client.exchange_auth_code_for_token({
|
77
|
+
# :redirect_uri => 'https://localhost:3000/oauth/v2/callback',
|
78
|
+
# :code => 'G3Y6jU3a',
|
79
|
+
# })
|
80
|
+
#
|
81
|
+
# POST /oauth2/access_token HTTP/1.1
|
82
|
+
# Host: www.yammer.com
|
83
|
+
# Content-Type: application/x-www-form-urlencoded
|
84
|
+
|
85
|
+
# client_id={client_id}&code=G3Y6jU3a&grant_type=authorization_code&
|
86
|
+
# redirect_uri=http%3A%2F%2Flocalhost%2Foauth%2Fcb&client_secret={client_secret}
|
87
|
+
|
88
|
+
def exchange_auth_code_for_token(opts={})
|
89
|
+
unless (opts[:params] && opts[:params][:code])
|
90
|
+
raise ArgumentError.new("You must include an authorization code as a parameter")
|
91
|
+
end
|
92
|
+
opts[:authenticate] ||= :body
|
93
|
+
code = opts[:params].delete(:code)
|
94
|
+
authorization_code.get_token(code, opts)
|
95
|
+
end
|
96
|
+
end
|