oauth3 1.0.3
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.
- checksums.yaml +7 -0
- data/lib/oauth3.rb +97 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4151158493b6c0035e630b0e188339a4c7b05c34
|
4
|
+
data.tar.gz: 59f10fd777ffebec56190c0c180b49e97c301973
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6d64fc1d31adc1ebc771916af940382e152ef9a8e846c9829f07b1171f9cd004196cde2e22eedca277314780ecb5386cf43bf712bbaf8a0ef172e0c584217a1d
|
7
|
+
data.tar.gz: 44566e908c777ca01c949a35aca115f3dde3ed74253c85efa2ac62c48a8575dd0f65ba8e70de5af36eb25b7209192e01cd3944d4e44c90560e5b34aae534ea07
|
data/lib/oauth3.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'oauth2'
|
2
|
+
require 'httpclient'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class Oauth3
|
6
|
+
#attr_reader :client
|
7
|
+
#attr_accessor :options
|
8
|
+
|
9
|
+
def initialize(registrar, options={})
|
10
|
+
# make sure all options for the OAuth module and faraday
|
11
|
+
# pass all the way down
|
12
|
+
@options = options
|
13
|
+
@states = {}
|
14
|
+
@providers = {}
|
15
|
+
@clients = {}
|
16
|
+
@registrar = registrar
|
17
|
+
end
|
18
|
+
|
19
|
+
def normalize_provider_uri(uri)
|
20
|
+
'https://' + uri.gsub(/https?:\/\//, '')
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_directive(provider_uri)
|
24
|
+
if @providers[provider_uri] # and @directive.timestamp < 1.day.old
|
25
|
+
return @providers[provider_uri][:directive]
|
26
|
+
end
|
27
|
+
|
28
|
+
# TODO if there's no prefix (https://), add it first
|
29
|
+
# TODO if the directive is stale, refresh it
|
30
|
+
http = HTTPClient.new()
|
31
|
+
response = http.get_content("#{provider_uri}/oauth3.json")
|
32
|
+
@providers[provider_uri] = {
|
33
|
+
provider_uri: provider_uri,
|
34
|
+
directive: JSON.parse(response),
|
35
|
+
timestamp: Time.now
|
36
|
+
}
|
37
|
+
@providers[provider_uri][:directive]
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_oauth2_client(provider_uri)
|
41
|
+
# TODO refresh the client when refreshing the directive
|
42
|
+
if @clients[provider_uri]
|
43
|
+
return @clients[provider_uri]
|
44
|
+
end
|
45
|
+
|
46
|
+
client_options = @options.dup
|
47
|
+
client_options[:site] = ""
|
48
|
+
client_options[:authorize_url] = get_directive(provider_uri)['authorization_dialog']['url']
|
49
|
+
client_options[:token_url] = get_directive(provider_uri)['access_token']['url']
|
50
|
+
|
51
|
+
@clients[provider_uri] = OAuth2::Client.new(
|
52
|
+
@registrar.get(provider_uri)['id'],
|
53
|
+
@registrar.get(provider_uri)['secret'],
|
54
|
+
client_options
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def random_string
|
60
|
+
(0...50).map { ('a'..'z').to_a[rand(26)] }.join
|
61
|
+
end
|
62
|
+
|
63
|
+
def authorize_url(provider_uri)
|
64
|
+
redirect_uri = @options[:redirect_uri]
|
65
|
+
rnd = random_string()
|
66
|
+
@states[rnd] = Time.now
|
67
|
+
|
68
|
+
# TODO state should go in params to the provider, not the redirect directly
|
69
|
+
# ... but ultimately it has the same effect, so whatever
|
70
|
+
get_oauth2_client(provider_uri).auth_code.authorize_url(
|
71
|
+
# TODO (change ? to & if there's already a ?)
|
72
|
+
redirect_uri: redirect_uri +
|
73
|
+
"?provider_uri=" + URI.encode_www_form_component(provider_uri) +
|
74
|
+
"&state=" + rnd
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
def validate_state(provider_uri, state)
|
79
|
+
# TODO delete stale states
|
80
|
+
@states[state]
|
81
|
+
end
|
82
|
+
|
83
|
+
def get_token(provider_uri, code)
|
84
|
+
get_oauth2_client(provider_uri).auth_code.get_token(code)
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_profile(provider_uri, token)
|
88
|
+
url = get_directive(provider_uri)['profile']['url']
|
89
|
+
OAuth2::AccessToken.new(get_oauth2_client(provider_uri), token).get(url)
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_resource(provider_uri, token, path)
|
93
|
+
url = get_directive(provider_uri)['api_base_url']
|
94
|
+
OAuth2::AccessToken.new(get_oauth2_client(provider_uri), token).get("#{url}/#{path}")
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: oauth3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- AJ ONeal
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oauth2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: httpclient
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.6.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.6.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.8.2
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.8.2
|
55
|
+
description:
|
56
|
+
email: coolaj86@gmail.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/oauth3.rb
|
62
|
+
homepage: https://github.com/OAuth3/ruby-oauth3-gem
|
63
|
+
licenses:
|
64
|
+
- TRON
|
65
|
+
metadata: {}
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 2.0.14
|
83
|
+
signing_key:
|
84
|
+
specification_version: 4
|
85
|
+
summary: OAuth3 (backwards compatible with OAuth2) authentication strategy for connecting
|
86
|
+
to any OAuth2 / OAuth3 provider in Ruby / Sinatra / etc
|
87
|
+
test_files: []
|