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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/oauth3.rb +97 -0
  3. metadata +87 -0
@@ -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
@@ -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: []