omniauth-bungie-oauth2 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 902e8466e478598129f2cfaddf9be23a7c208ae9
4
+ data.tar.gz: 3dd6a9d0b761309041f052b6d6a51019c37891e3
5
+ SHA512:
6
+ metadata.gz: d622358e21d6ea2cdc0c250cc78f0202f2ac399cd369baa4bc8e83d09b7cc31f28172001b09645ec8436d7745e706a60c5047a136b1301ef970647d3d096529a
7
+ data.tar.gz: 6a8b7d04d85dfc5fd84e6d02705588337b8c911d7393a8925bb2e89e9c6a3a7826ae5fff625705a564af47927144da973b47d40259a4de971fb2bc24c30ba343
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .idea
11
+ .gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ before_install: gem install bundler -v 1.13.7
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, gender identity and expression, level of experience,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at dkruban@gmail.com. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [http://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: http://contributor-covenant.org
74
+ [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Dmitry Ruban
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # Omniauth::Bungie::Oauth2
2
+
3
+ A Bungie OAuth2 strategy for Omniauth.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'omniauth-bungie-oauth2'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ ## Usage
18
+
19
+ For full usage this gem You must create an application on [Bungie.net](https://www.bungie.net/en/application).
20
+
21
+ After this, you can integrate this strategy with your application. (More about A Bungie OAuth2 you can read on [Help page](https://www.bungie.net/en/Help/Article/45481))
22
+
23
+ For example, you can add the middleware to a Rails application in `/config/application.rb`:
24
+
25
+ ~~~ruby
26
+ config.middleware.use OmniAuth::Builder do
27
+ provider :bungie,
28
+ 'x_api_key_from_bungie_app_settings',
29
+ 'authorization_url_from_bungie_app_settings',
30
+ :origin => 'origin_url_if_you_need'
31
+ end
32
+ ~~~~
33
+
34
+ After all manipulation the `request.env["omniauth.auth"]` have the next fields:
35
+
36
+ * `uid` with BungieNetUser membershipId
37
+ * `info` with Destiny membershipId, membershipType and displayName
38
+ * `extra` with [GetBungieAccount](https://destinydevs.github.io/BungieNetPlatform/docs/UserService/GetBungieAccount) result
39
+
40
+ ## Configuration
41
+
42
+ This provider require two arguments and have one special option:
43
+
44
+ * `api_key` - X-Api-Key for Bungie API;
45
+ * `auth_url` - Autherization url;
46
+ * `origin` - Origin url;
47
+
48
+ ## Contributing
49
+
50
+ Bug reports and pull requests are welcome on GitHub at https://github.com/RuBAN-GT/omniauth-bungie-oauth2. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
51
+
52
+ ## License
53
+
54
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
55
+
56
+ ## Fireteam
57
+
58
+ If you want to fight with Oryx with me or create any interesting applications for Destiny, you can add me ([https://www.bungie.net/en/Profile/254/12488384](https://www.bungie.net/en/Profile/254/12488384)).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,19 @@
1
+ module OAuth2
2
+ class BungieAccessToken < AccessToken
3
+ # Updated refreshing method for a special bungie page
4
+ def refresh!(params = {})
5
+ raise('A refresh_token is not available') unless refresh_token
6
+
7
+ params[:client_id] = @client.id
8
+ params[:client_secret] = @client.secret
9
+ params[:grant_type] = 'refresh_token'
10
+ params[:refresh_token] = refresh_token
11
+ params[:refreshToken] = params[:refresh_token]
12
+
13
+ new_token = @client.get_token_with_refresh(params)
14
+ new_token.options = options
15
+ new_token.refresh_token = refresh_token unless new_token.refresh_token
16
+ new_token
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,90 @@
1
+ module OAuth2
2
+ class BungieClient < Client
3
+ def initialize(client_id, client_secret, options = {}, &block)
4
+ opts = options.dup
5
+ @id = client_id
6
+ @secret = client_secret
7
+ @site = 'https://www.bungie.net'
8
+ ssl = opts.delete(:ssl)
9
+ @options = {
10
+ :authorize_url => 'https://www.bungie.net',
11
+ :token_url => 'https://www.bungie.net/Platform/App/GetAccessTokensFromCode',
12
+ :refresh_token_url => 'https://www.bungie.net/Platform/App/GetAccessTokensFromRefreshToken',
13
+ :token_method => :post,
14
+ :connection_opts => {},
15
+ :connection_build => block,
16
+ :max_redirects => 5,
17
+ :raise_errors => true}.merge(opts)
18
+ @options[:connection_opts][:ssl] = ssl if ssl
19
+ end
20
+
21
+ def get_token(params, access_token_opts = {}, access_token_class = BungieAccessToken)
22
+ opts = {:raise_errors => options[:raise_errors], :parse => params.delete(:parse)}
23
+
24
+ if options[:token_method] == :post
25
+ headers = params.delete(:headers)
26
+ opts[:body] = params
27
+ opts[:headers] = {'Content-Type' => 'application/json'}
28
+ opts[:headers].merge!(headers) if headers
29
+ else
30
+ opts[:params] = params
31
+ end
32
+
33
+ response = request(options[:token_method], token_url, opts)
34
+
35
+ error = Error.new(response)
36
+
37
+ response = get_normalized_response(response)
38
+
39
+ raise(error) if options[:raise_errors] && !(response.is_a?(Hash) && response['access_token'])
40
+
41
+ access_token_class.from_hash(self, response.merge(access_token_opts))
42
+ end
43
+
44
+ def get_token_with_refresh(params, access_token_opts = {}, access_token_class = BungieAccessToken)
45
+ opts = {:raise_errors => options[:raise_errors], :parse => params.delete(:parse)}
46
+
47
+ if options[:token_method] == :post
48
+ headers = params.delete(:headers)
49
+ opts[:body] = params
50
+ opts[:headers] = {'Content-Type' => 'application/json'}
51
+ opts[:headers].merge!(headers) if headers
52
+ else
53
+ opts[:params] = params
54
+ end
55
+
56
+ response = request(
57
+ options[:token_method],
58
+ connection.build_url(options[:refresh_token_url]).to_s,
59
+ opts
60
+ )
61
+
62
+ error = Error.new(response)
63
+
64
+ response = get_normalized_response(response)
65
+
66
+ raise(error) if options[:raise_errors] && !(response.is_a?(Hash) && response['access_token'])
67
+
68
+ access_token_class.from_hash(self, response.merge(access_token_opts))
69
+ end
70
+
71
+ # Transform response body to RFC specification
72
+ def get_normalized_response(response)
73
+ response = response.parsed
74
+
75
+ return nil unless response.is_a?(Hash)
76
+
77
+ if response['ErrorCode'] == 1 && !response.dig('Response', 'accessToken').nil?
78
+ {
79
+ 'access_token' => response.dig('Response', 'accessToken', 'value'),
80
+ 'token_type' => 'Bearer',
81
+ 'expires_in' => response.dig('Response', 'accessToken', 'expires'),
82
+ 'refresh_token' => response.dig('Response', 'refreshToken', 'value'),
83
+ 'refresh_expries_in' => response.dig('Response', 'refreshToken', 'expires')
84
+ }
85
+ else
86
+ response
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,9 @@
1
+ require 'json'
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+ require 'oauth2'
5
+
6
+ require 'oauth2/bungie_access_token'
7
+ require 'oauth2/bungie_client'
8
+ require 'omniauth-bungie-oauth2/version'
9
+ require 'omniauth/strategies/bungie'
@@ -0,0 +1,5 @@
1
+ module Omniauth
2
+ module BungieOauth2
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,102 @@
1
+ require 'omniauth'
2
+ require 'omniauth-oauth2'
3
+ require 'socket'
4
+ require 'timeout'
5
+
6
+ module OmniAuth
7
+ module Strategies
8
+ class Bungie < OmniAuth::Strategies::OAuth2
9
+ # Arguments
10
+ args [:api_key, :auth_url]
11
+
12
+ # Options
13
+ option :name, 'bungie'
14
+ option :origin, nil
15
+
16
+ # Update client with Faraday middleware & special authorize url.
17
+ def client
18
+ client_options = {
19
+ :authorize_url => options.auth_url
20
+ }.merge(options.client_options)
21
+
22
+ ::OAuth2::BungieClient.new(nil, nil, deep_symbolize(client_options)) do |b|
23
+ b.request :json
24
+
25
+ b.adapter Faraday.default_adapter
26
+ end
27
+ end
28
+
29
+ # Updated callback phase with new refreshing
30
+ def callback_phase
31
+ error = request.params["error_reason"] || request.params["error"]
32
+
33
+ if error
34
+ fail!(error, CallbackError.new(request.params["error"], request.params["error_description"] || request.params["error_reason"], request.params["error_uri"]))
35
+ elsif !options.provider_ignores_state && (request.params["state"].to_s.empty? || request.params["state"] != session.delete("omniauth.state"))
36
+ fail!(:csrf_detected, CallbackError.new(:csrf_detected, "CSRF detected"))
37
+ else
38
+ self.access_token = build_access_token
39
+ self.access_token = access_token.refresh!(token_params) if access_token.expired?
40
+
41
+ env['omniauth.auth'] = auth_hash
42
+ call_app!
43
+ end
44
+ rescue ::OAuth2::Error, CallbackError => e
45
+ fail!(:invalid_credentials, e)
46
+ rescue ::Timeout::Error, ::Errno::ETIMEDOUT => e
47
+ fail!(:timeout, e)
48
+ rescue ::SocketError => e
49
+ fail!(:failed_to_connect, e)
50
+ end
51
+
52
+ # Defining of Origin string
53
+ def origin
54
+ if options.origin === true
55
+ request.base_url
56
+ elsif options.origin.is_a? String
57
+ options.origin
58
+ else
59
+ ''
60
+ end
61
+ end
62
+
63
+ # Token params with X-Api-Key & Origin
64
+ def token_params
65
+ token_params = options.token_params.merge(options_for("token"))
66
+
67
+ token_params[:headers] ||= {}
68
+ token_params[:headers]['X-Api-Key'] = options.api_key
69
+ token_params[:headers]['Origin'] = origin unless options.origin.nil?
70
+
71
+ token_params
72
+ end
73
+
74
+ # Get important data
75
+ uid { raw_info.dig('bungieNetUser', 'membershipId') }
76
+ info do
77
+ destiny = raw_info['destinyAccounts']&.first
78
+
79
+ {
80
+ :membership_id => destiny.dig('userInfo', 'membershipId'),
81
+ :membership_type => destiny.dig('userInfo', 'membershipType'),
82
+ :display_name => destiny.dig('userInfo', 'displayName')
83
+ } unless destiny.nil?
84
+ end
85
+ extra do
86
+ {
87
+ 'raw_info' => raw_info
88
+ }
89
+ end
90
+ def raw_info
91
+ return @raw_info unless @raw_info.nil?
92
+
93
+ @raw_info = access_token.get(
94
+ '/Platform/User/GetCurrentBungieAccount/',
95
+ token_params
96
+ ).parsed
97
+
98
+ @raw_info = @raw_info.dig('Response')
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'omniauth-bungie-oauth2/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'omniauth-bungie-oauth2'
8
+ spec.version = Omniauth::BungieOauth2::VERSION
9
+ spec.authors = ['Dmitry Ruban']
10
+ spec.email = ['dkruban@gmail.com']
11
+
12
+ spec.summary = %q{A Bungie OAuth2 strategy for Omniauth}
13
+ spec.description = %q{A Bungie OAuth2 strategy for Omniauth}
14
+ spec.homepage = 'https://github.com/RuBAN-GT/omniauth-bungie-oauth2'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files`.split("\n")
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.13'
21
+ spec.add_development_dependency 'rake', '~> 10.0'
22
+ spec.add_development_dependency 'rspec', '~> 3.0'
23
+
24
+ spec.add_runtime_dependency 'faraday', '~> 0.9'
25
+ spec.add_runtime_dependency 'faraday_middleware', '~> 0'
26
+ spec.add_runtime_dependency 'oauth2', '~> 1.2', '>= 1.2.0'
27
+ spec.add_runtime_dependency 'omniauth', '~> 1.3', '>= 1.3.1'
28
+ spec.add_runtime_dependency 'omniauth-oauth2', '~> 1.4', '>= 1.4.0'
29
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'omniauth-bungie-oauth2'
3
+
4
+ describe Omniauth::Strategies::Bungie do
5
+ it "has a version number" do
6
+ expect(Omniauth::BungieOauth2::VERSION).not_to be nil
7
+ end
8
+
9
+ it "does something useful" do
10
+ expect(false).to eq(true)
11
+ end
12
+ end
@@ -0,0 +1,2 @@
1
+ require File.join('bundler', 'setup')
2
+ require 'rspec'
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-bungie-oauth2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dmitry Ruban
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday_middleware
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: oauth2
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.2'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 1.2.0
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1.2'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 1.2.0
103
+ - !ruby/object:Gem::Dependency
104
+ name: omniauth
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 1.3.1
113
+ type: :runtime
114
+ prerelease: false
115
+ version_requirements: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '1.3'
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 1.3.1
123
+ - !ruby/object:Gem::Dependency
124
+ name: omniauth-oauth2
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '1.4'
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 1.4.0
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '1.4'
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 1.4.0
143
+ description: A Bungie OAuth2 strategy for Omniauth
144
+ email:
145
+ - dkruban@gmail.com
146
+ executables: []
147
+ extensions: []
148
+ extra_rdoc_files: []
149
+ files:
150
+ - ".gitignore"
151
+ - ".rspec"
152
+ - ".travis.yml"
153
+ - CODE_OF_CONDUCT.md
154
+ - Gemfile
155
+ - LICENSE.txt
156
+ - README.md
157
+ - Rakefile
158
+ - lib/oauth2/bungie_access_token.rb
159
+ - lib/oauth2/bungie_client.rb
160
+ - lib/omniauth-bungie-oauth2.rb
161
+ - lib/omniauth-bungie-oauth2/version.rb
162
+ - lib/omniauth/strategies/bungie.rb
163
+ - omniauth-bungie-oauth2.gemspec
164
+ - spec/omniauth/strategies/bungie_oauth2_spec.rb
165
+ - spec/spec_helper.rb
166
+ homepage: https://github.com/RuBAN-GT/omniauth-bungie-oauth2
167
+ licenses:
168
+ - MIT
169
+ metadata: {}
170
+ post_install_message:
171
+ rdoc_options: []
172
+ require_paths:
173
+ - lib
174
+ required_ruby_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ requirements: []
185
+ rubyforge_project:
186
+ rubygems_version: 2.5.2
187
+ signing_key:
188
+ specification_version: 4
189
+ summary: A Bungie OAuth2 strategy for Omniauth
190
+ test_files: []