googleauth 0.6.2 → 0.6.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 +5 -5
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/CODE_OF_CONDUCT.md +43 -0
- data/Gemfile +1 -0
- data/README.md +9 -0
- data/googleauth.gemspec +1 -2
- data/lib/googleauth/application_default.rb +5 -1
- data/lib/googleauth/client_id.rb +4 -2
- data/lib/googleauth/credentials.rb +8 -7
- data/lib/googleauth/credentials_loader.rb +17 -0
- data/lib/googleauth/default_credentials.rb +3 -1
- data/lib/googleauth/json_key_reader.rb +45 -0
- data/lib/googleauth/service_account.rb +11 -17
- data/lib/googleauth/user_authorizer.rb +0 -1
- data/lib/googleauth/user_refresh.rb +2 -2
- data/lib/googleauth/version.rb +1 -1
- data/spec/googleauth/client_id_spec.rb +21 -4
- data/spec/googleauth/credentials_spec.rb +34 -14
- data/spec/googleauth/get_application_default_spec.rb +24 -11
- data/spec/googleauth/service_account_spec.rb +7 -0
- data/spec/googleauth/signet_spec.rb +3 -3
- data/spec/googleauth/user_authorizer_spec.rb +4 -4
- data/spec/googleauth/user_refresh_spec.rb +5 -5
- data/spec/googleauth/web_user_authorizer_spec.rb +1 -1
- metadata +13 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1528ae25e5c678b4b8be00b85095ee5f95ca83fdbcca2c7629cc429d80565e1c
|
4
|
+
data.tar.gz: cbc4aef5eea0fab23d0b529c8af5d9a2aa297c107e38e9fa1d220682d0f6fa61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13caa772bb5c2ebf1565f18160b59132839d5cd76560764cc235d2390df7b032196c6402fcd075e8356404a69d7970011bfde9904a86c20861a4a5031b221c81
|
7
|
+
data.tar.gz: e25c85dd789d8267e6c5aa4e7cd3041b5ce4185b97157cbee0b92e98a5a66c7cbd2dcdae459493d5b5f74d81e415958c764ab0ac4c998281bdc04b103363354a
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Contributor Code of Conduct
|
2
|
+
|
3
|
+
As contributors and maintainers of this project,
|
4
|
+
and in the interest of fostering an open and welcoming community,
|
5
|
+
we pledge to respect all people who contribute through reporting issues,
|
6
|
+
posting feature requests, updating documentation,
|
7
|
+
submitting pull requests or patches, and other activities.
|
8
|
+
|
9
|
+
We are committed to making participation in this project
|
10
|
+
a harassment-free experience for everyone,
|
11
|
+
regardless of level of experience, gender, gender identity and expression,
|
12
|
+
sexual orientation, disability, personal appearance,
|
13
|
+
body size, race, ethnicity, age, religion, or nationality.
|
14
|
+
|
15
|
+
Examples of unacceptable behavior by participants include:
|
16
|
+
|
17
|
+
* The use of sexualized language or imagery
|
18
|
+
* Personal attacks
|
19
|
+
* Trolling or insulting/derogatory comments
|
20
|
+
* Public or private harassment
|
21
|
+
* Publishing other's private information,
|
22
|
+
such as physical or electronic
|
23
|
+
addresses, without explicit permission
|
24
|
+
* Other unethical or unprofessional conduct.
|
25
|
+
|
26
|
+
Project maintainers have the right and responsibility to remove, edit, or reject
|
27
|
+
comments, commits, code, wiki edits, issues, and other contributions
|
28
|
+
that are not aligned to this Code of Conduct.
|
29
|
+
By adopting this Code of Conduct,
|
30
|
+
project maintainers commit themselves to fairly and consistently
|
31
|
+
applying these principles to every aspect of managing this project.
|
32
|
+
Project maintainers who do not follow or enforce the Code of Conduct
|
33
|
+
may be permanently removed from the project team.
|
34
|
+
|
35
|
+
This code of conduct applies both within project spaces and in public spaces
|
36
|
+
when an individual is representing the project or its community.
|
37
|
+
|
38
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior
|
39
|
+
may be reported by opening an issue
|
40
|
+
or contacting one or more of the project maintainers.
|
41
|
+
|
42
|
+
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0,
|
43
|
+
available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -143,6 +143,15 @@ authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
|
|
143
143
|
authorizer.fetch_access_token!
|
144
144
|
```
|
145
145
|
|
146
|
+
### Example (Environment Variables)
|
147
|
+
|
148
|
+
```bash
|
149
|
+
export GOOGLE_ACCOUNT_TYPE=service_account
|
150
|
+
export GOOGLE_CLIENT_ID=000000000000000000000
|
151
|
+
export GOOGLE_CLIENT_EMAIL=xxxx@xxxx.iam.gserviceaccount.com
|
152
|
+
export GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
|
153
|
+
```
|
154
|
+
|
146
155
|
### Storage
|
147
156
|
|
148
157
|
Authorizers require a storage instance to manage long term persistence of
|
data/googleauth.gemspec
CHANGED
@@ -27,10 +27,9 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.platform = Gem::Platform::RUBY
|
28
28
|
|
29
29
|
s.add_dependency 'faraday', '~> 0.12'
|
30
|
-
s.add_dependency 'logging', '~> 2.0'
|
31
30
|
s.add_dependency 'jwt', '>= 1.4', '< 3.0'
|
32
31
|
s.add_dependency 'memoist', '~> 0.12'
|
33
32
|
s.add_dependency 'multi_json', '~> 1.11'
|
34
|
-
s.add_dependency 'os', '
|
33
|
+
s.add_dependency 'os', '>= 0.9', '< 2.0'
|
35
34
|
s.add_dependency 'signet', '~> 0.7'
|
36
35
|
end
|
@@ -58,7 +58,11 @@ ERROR_MESSAGE
|
|
58
58
|
DefaultCredentials.from_well_known_path(scope) ||
|
59
59
|
DefaultCredentials.from_system_default_path(scope)
|
60
60
|
return creds unless creds.nil?
|
61
|
-
|
61
|
+
unless GCECredentials.on_gce?(options)
|
62
|
+
# Clear cache of the result of GCECredentials.on_gce?
|
63
|
+
GCECredentials.unmemoize_all
|
64
|
+
raise NOT_FOUND_ERROR
|
65
|
+
end
|
62
66
|
GCECredentials.new
|
63
67
|
end
|
64
68
|
|
data/lib/googleauth/client_id.rb
CHANGED
@@ -28,6 +28,7 @@
|
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
require 'multi_json'
|
31
|
+
require 'googleauth/credentials_loader'
|
31
32
|
|
32
33
|
module Google
|
33
34
|
module Auth
|
@@ -63,13 +64,14 @@ module Google
|
|
63
64
|
# & secrets in source. See {#from_file} to load from
|
64
65
|
# `client_secrets.json` files.
|
65
66
|
def initialize(id, secret)
|
67
|
+
CredentialsLoader.warn_if_cloud_sdk_credentials id
|
66
68
|
raise 'Client id can not be nil' if id.nil?
|
67
69
|
raise 'Client secret can not be nil' if secret.nil?
|
68
70
|
@id = id
|
69
71
|
@secret = secret
|
70
72
|
end
|
71
73
|
|
72
|
-
# Constructs a Client ID from a JSON file
|
74
|
+
# Constructs a Client ID from a JSON file downloaded from the
|
73
75
|
# Google Developers Console.
|
74
76
|
#
|
75
77
|
# @param [String, File] file
|
@@ -79,7 +81,7 @@ module Google
|
|
79
81
|
raise 'File can not be nil.' if file.nil?
|
80
82
|
File.open(file.to_s) do |f|
|
81
83
|
json = f.read
|
82
|
-
config = MultiJson.load
|
84
|
+
config = MultiJson.load json
|
83
85
|
from_hash(config)
|
84
86
|
end
|
85
87
|
end
|
@@ -31,15 +31,15 @@ require 'forwardable'
|
|
31
31
|
require 'json'
|
32
32
|
require 'signet/oauth_2/client'
|
33
33
|
|
34
|
-
require 'googleauth/
|
34
|
+
require 'googleauth/credentials_loader'
|
35
35
|
|
36
36
|
module Google
|
37
37
|
module Auth
|
38
38
|
# This class is intended to be inherited by API-specific classes
|
39
39
|
# which overrides the SCOPE constant.
|
40
40
|
class Credentials
|
41
|
-
TOKEN_CREDENTIAL_URI = 'https://
|
42
|
-
AUDIENCE = 'https://
|
41
|
+
TOKEN_CREDENTIAL_URI = 'https://oauth2.googleapis.com/token'.freeze
|
42
|
+
AUDIENCE = 'https://oauth2.googleapis.com/token'.freeze
|
43
43
|
SCOPE = [].freeze
|
44
44
|
PATH_ENV_VARS = [].freeze
|
45
45
|
JSON_ENV_VARS = [].freeze
|
@@ -68,6 +68,7 @@ module Google
|
|
68
68
|
json['scope'] ||= scope
|
69
69
|
@client = init_client json
|
70
70
|
end
|
71
|
+
CredentialsLoader.warn_if_cloud_sdk_credentials @client.client_id
|
71
72
|
@client.fetch_access_token!
|
72
73
|
end
|
73
74
|
|
@@ -78,16 +79,16 @@ module Google
|
|
78
79
|
def self.default(options = {})
|
79
80
|
scope = options[:scope]
|
80
81
|
# First try to find keyfile file from environment variables.
|
81
|
-
client = from_path_vars
|
82
|
+
client = from_path_vars scope
|
82
83
|
|
83
84
|
# Second try to find keyfile json from environment variables.
|
84
|
-
client ||= from_json_vars
|
85
|
+
client ||= from_json_vars scope
|
85
86
|
|
86
87
|
# Third try to find keyfile file from known file paths.
|
87
|
-
client ||= from_default_paths
|
88
|
+
client ||= from_default_paths scope
|
88
89
|
|
89
90
|
# Finally get instantiated client from Google::Auth
|
90
|
-
client ||= from_application_default
|
91
|
+
client ||= from_application_default scope
|
91
92
|
client
|
92
93
|
end
|
93
94
|
|
@@ -57,6 +57,17 @@ module Google
|
|
57
57
|
SYSTEM_DEFAULT_ERROR =
|
58
58
|
'Unable to read the system default credential file'.freeze
|
59
59
|
|
60
|
+
CLOUD_SDK_CLIENT_ID = '764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.app'\
|
61
|
+
's.googleusercontent.com'.freeze
|
62
|
+
|
63
|
+
CLOUD_SDK_CREDENTIALS_WARNING = 'Your application has authenticated '\
|
64
|
+
'using end user credentials from Google Cloud SDK. We recommend that '\
|
65
|
+
'most server applications use service accounts instead. If your '\
|
66
|
+
'application continues to use end user credentials from Cloud SDK, '\
|
67
|
+
'you might receive a "quota exceeded" or "API not enabled" error. For'\
|
68
|
+
' more information about service accounts, see '\
|
69
|
+
'https://cloud.google.com/docs/authentication/.'.freeze
|
70
|
+
|
60
71
|
# make_creds proxies the construction of a credentials instance
|
61
72
|
#
|
62
73
|
# By default, it calls #new on the current class, but this behaviour can
|
@@ -119,6 +130,12 @@ module Google
|
|
119
130
|
raise "#{SYSTEM_DEFAULT_ERROR}: #{e}"
|
120
131
|
end
|
121
132
|
|
133
|
+
# Issues warning if cloud sdk client id is used
|
134
|
+
def warn_if_cloud_sdk_credentials(client_id)
|
135
|
+
warn CLOUD_SDK_CREDENTIALS_WARNING if client_id == CLOUD_SDK_CLIENT_ID
|
136
|
+
end
|
137
|
+
module_function :warn_if_cloud_sdk_credentials
|
138
|
+
|
122
139
|
private
|
123
140
|
|
124
141
|
def service_account_env_vars?
|
@@ -49,9 +49,11 @@ module Google
|
|
49
49
|
json_key_io, scope = options.values_at(:json_key_io, :scope)
|
50
50
|
if json_key_io
|
51
51
|
json_key, clz = determine_creds_class(json_key_io)
|
52
|
+
warn_if_cloud_sdk_credentials json_key['client_id']
|
52
53
|
clz.make_creds(json_key_io: StringIO.new(MultiJson.dump(json_key)),
|
53
54
|
scope: scope)
|
54
55
|
else
|
56
|
+
warn_if_cloud_sdk_credentials ENV[CLIENT_ID_VAR]
|
55
57
|
clz = read_creds
|
56
58
|
clz.make_creds(scope: scope)
|
57
59
|
end
|
@@ -73,7 +75,7 @@ module Google
|
|
73
75
|
|
74
76
|
# Reads the input json and determines which creds class to use.
|
75
77
|
def self.determine_creds_class(json_key_io)
|
76
|
-
json_key = MultiJson.load
|
78
|
+
json_key = MultiJson.load json_key_io.read
|
77
79
|
key = 'type'
|
78
80
|
raise "the json is missing the '#{key}' field" unless json_key.key?(key)
|
79
81
|
type = json_key[key]
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Copyright 2015, Google Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are
|
6
|
+
# met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright
|
9
|
+
# notice, this list of conditions and the following disclaimer.
|
10
|
+
# * Redistributions in binary form must reproduce the above
|
11
|
+
# copyright notice, this list of conditions and the following disclaimer
|
12
|
+
# in the documentation and/or other materials provided with the
|
13
|
+
# distribution.
|
14
|
+
# * Neither the name of Google Inc. nor the names of its
|
15
|
+
# contributors may be used to endorse or promote products derived from
|
16
|
+
# this software without specific prior written permission.
|
17
|
+
#
|
18
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
+
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
module Google
|
31
|
+
# Module Auth provides classes that provide Google-specific authorization
|
32
|
+
# used to access Google APIs.
|
33
|
+
module Auth
|
34
|
+
# JsonKeyReader contains the behaviour used to read private key and
|
35
|
+
# client email fields from the service account
|
36
|
+
module JsonKeyReader
|
37
|
+
def read_json_key(json_key_io)
|
38
|
+
json_key = MultiJson.load(json_key_io.read)
|
39
|
+
raise 'missing client_email' unless json_key.key?('client_email')
|
40
|
+
raise 'missing private_key' unless json_key.key?('private_key')
|
41
|
+
[json_key['private_key'], json_key['client_email']]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -29,6 +29,7 @@
|
|
29
29
|
|
30
30
|
require 'googleauth/signet'
|
31
31
|
require 'googleauth/credentials_loader'
|
32
|
+
require 'googleauth/json_key_reader'
|
32
33
|
require 'jwt'
|
33
34
|
require 'multi_json'
|
34
35
|
require 'stringio'
|
@@ -48,6 +49,7 @@ module Google
|
|
48
49
|
class ServiceAccountCredentials < Signet::OAuth2::Client
|
49
50
|
TOKEN_CRED_URI = 'https://www.googleapis.com/oauth2/v4/token'.freeze
|
50
51
|
extend CredentialsLoader
|
52
|
+
extend JsonKeyReader
|
51
53
|
|
52
54
|
# Creates a ServiceAccountCredentials.
|
53
55
|
#
|
@@ -58,7 +60,7 @@ module Google
|
|
58
60
|
if json_key_io
|
59
61
|
private_key, client_email = read_json_key(json_key_io)
|
60
62
|
else
|
61
|
-
private_key = ENV[CredentialsLoader::PRIVATE_KEY_VAR]
|
63
|
+
private_key = unescape ENV[CredentialsLoader::PRIVATE_KEY_VAR]
|
62
64
|
client_email = ENV[CredentialsLoader::CLIENT_EMAIL_VAR]
|
63
65
|
end
|
64
66
|
|
@@ -69,13 +71,13 @@ module Google
|
|
69
71
|
signing_key: OpenSSL::PKey::RSA.new(private_key))
|
70
72
|
end
|
71
73
|
|
72
|
-
#
|
73
|
-
#
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
74
|
+
# Handles certain escape sequences that sometimes appear in input.
|
75
|
+
# Specifically, interprets the "\n" sequence for newline, and removes
|
76
|
+
# enclosing quotes.
|
77
|
+
def self.unescape(str)
|
78
|
+
str = str.gsub '\n', "\n"
|
79
|
+
str = str[1..-2] if str.start_with?('"') && str.end_with?('"')
|
80
|
+
str
|
79
81
|
end
|
80
82
|
|
81
83
|
def initialize(options = {})
|
@@ -123,6 +125,7 @@ module Google
|
|
123
125
|
SIGNING_ALGORITHM = 'RS256'.freeze
|
124
126
|
EXPIRY = 60
|
125
127
|
extend CredentialsLoader
|
128
|
+
extend JsonKeyReader
|
126
129
|
|
127
130
|
# make_creds proxies the construction of a credentials instance
|
128
131
|
#
|
@@ -135,15 +138,6 @@ module Google
|
|
135
138
|
new(json_key_io: args[0][:json_key_io])
|
136
139
|
end
|
137
140
|
|
138
|
-
# Reads the private key and client email fields from the service account
|
139
|
-
# JSON key.
|
140
|
-
def self.read_json_key(json_key_io)
|
141
|
-
json_key = MultiJson.load(json_key_io.read)
|
142
|
-
raise 'missing client_email' unless json_key.key?('client_email')
|
143
|
-
raise 'missing private_key' unless json_key.key?('private_key')
|
144
|
-
[json_key['private_key'], json_key['client_email']]
|
145
|
-
end
|
146
|
-
|
147
141
|
# Initializes a ServiceAccountJwtHeaderCredentials.
|
148
142
|
#
|
149
143
|
# @param json_key_io [IO] an IO from which the JSON key can be read
|
@@ -198,7 +198,6 @@ module Google
|
|
198
198
|
# Credentials if exchange is successful
|
199
199
|
def get_and_store_credentials_from_code(options = {})
|
200
200
|
credentials = get_credentials_from_code(options)
|
201
|
-
monitor_credentials(options[:user_id], credentials)
|
202
201
|
store_credentials(options[:user_id], credentials)
|
203
202
|
end
|
204
203
|
|
@@ -46,9 +46,9 @@ module Google
|
|
46
46
|
#
|
47
47
|
# cf [Application Default Credentials](http://goo.gl/mkAHpZ)
|
48
48
|
class UserRefreshCredentials < Signet::OAuth2::Client
|
49
|
-
TOKEN_CRED_URI = 'https://
|
49
|
+
TOKEN_CRED_URI = 'https://oauth2.googleapis.com/token'.freeze
|
50
50
|
AUTHORIZATION_URI = 'https://accounts.google.com/o/oauth2/auth'.freeze
|
51
|
-
REVOKE_TOKEN_URI = 'https://
|
51
|
+
REVOKE_TOKEN_URI = 'https://oauth2.googleapis.com/revoke'.freeze
|
52
52
|
extend CredentialsLoader
|
53
53
|
|
54
54
|
# Create a UserRefreshCredentials.
|
data/lib/googleauth/version.rb
CHANGED
@@ -48,7 +48,7 @@ describe Google::Auth::ClientId do
|
|
48
48
|
|
49
49
|
shared_examples 'it can successfully load client_id' do
|
50
50
|
context 'loaded from hash' do
|
51
|
-
let(:client_id) { Google::Auth::ClientId.from_hash
|
51
|
+
let(:client_id) { Google::Auth::ClientId.from_hash config }
|
52
52
|
|
53
53
|
it_behaves_like 'it has a valid config'
|
54
54
|
end
|
@@ -103,7 +103,7 @@ describe Google::Auth::ClientId do
|
|
103
103
|
end
|
104
104
|
|
105
105
|
it 'should raise error' do
|
106
|
-
expect { Google::Auth::ClientId.from_hash
|
106
|
+
expect { Google::Auth::ClientId.from_hash config }.to raise_error(
|
107
107
|
/Expected top level property/
|
108
108
|
)
|
109
109
|
end
|
@@ -119,7 +119,7 @@ describe Google::Auth::ClientId do
|
|
119
119
|
end
|
120
120
|
|
121
121
|
it 'should raise error' do
|
122
|
-
expect { Google::Auth::ClientId.from_hash
|
122
|
+
expect { Google::Auth::ClientId.from_hash config }.to raise_error(
|
123
123
|
/Client id can not be nil/
|
124
124
|
)
|
125
125
|
end
|
@@ -135,9 +135,26 @@ describe Google::Auth::ClientId do
|
|
135
135
|
end
|
136
136
|
|
137
137
|
it 'should raise error' do
|
138
|
-
expect { Google::Auth::ClientId.from_hash
|
138
|
+
expect { Google::Auth::ClientId.from_hash config }.to raise_error(
|
139
139
|
/Client secret can not be nil/
|
140
140
|
)
|
141
141
|
end
|
142
142
|
end
|
143
|
+
|
144
|
+
context 'with cloud sdk credentials' do
|
145
|
+
let(:config) do
|
146
|
+
{
|
147
|
+
'web' => {
|
148
|
+
'client_id' => Google::Auth::CredentialsLoader::CLOUD_SDK_CLIENT_ID,
|
149
|
+
'client_secret' => 'notasecret'
|
150
|
+
}
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should raise warning' do
|
155
|
+
expect { Google::Auth::ClientId.from_hash config }.to output(
|
156
|
+
Google::Auth::CredentialsLoader::CLOUD_SDK_CREDENTIALS_WARNING + "\n"
|
157
|
+
).to_stderr
|
158
|
+
end
|
159
|
+
end
|
143
160
|
end
|
@@ -29,6 +29,7 @@
|
|
29
29
|
|
30
30
|
require 'googleauth'
|
31
31
|
|
32
|
+
|
32
33
|
# This test is testing the private class Google::Auth::Credentials. We want to
|
33
34
|
# make sure that the passed in scope propogates to the Signet object. This means
|
34
35
|
# testing the private API, which is generally frowned on.
|
@@ -46,9 +47,10 @@ describe Google::Auth::Credentials, :private do
|
|
46
47
|
it 'uses a default scope' do
|
47
48
|
mocked_signet = double('Signet::OAuth2::Client')
|
48
49
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
50
|
+
allow(mocked_signet).to receive(:client_id)
|
49
51
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
50
|
-
expect(options[:token_credential_uri]).to eq('https://
|
51
|
-
expect(options[:audience]).to eq('https://
|
52
|
+
expect(options[:token_credential_uri]).to eq('https://oauth2.googleapis.com/token')
|
53
|
+
expect(options[:audience]).to eq('https://oauth2.googleapis.com/token')
|
52
54
|
expect(options[:scope]).to eq([])
|
53
55
|
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
54
56
|
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
@@ -62,9 +64,10 @@ describe Google::Auth::Credentials, :private do
|
|
62
64
|
it 'uses a custom scope' do
|
63
65
|
mocked_signet = double('Signet::OAuth2::Client')
|
64
66
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
67
|
+
allow(mocked_signet).to receive(:client_id)
|
65
68
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
66
|
-
expect(options[:token_credential_uri]).to eq('https://
|
67
|
-
expect(options[:audience]).to eq('https://
|
69
|
+
expect(options[:token_credential_uri]).to eq('https://oauth2.googleapis.com/token')
|
70
|
+
expect(options[:audience]).to eq('https://oauth2.googleapis.com/token')
|
68
71
|
expect(options[:scope]).to eq(['http://example.com/scope'])
|
69
72
|
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
70
73
|
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
@@ -93,9 +96,10 @@ describe Google::Auth::Credentials, :private do
|
|
93
96
|
|
94
97
|
mocked_signet = double('Signet::OAuth2::Client')
|
95
98
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
99
|
+
allow(mocked_signet).to receive(:client_id)
|
96
100
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
97
|
-
expect(options[:token_credential_uri]).to eq('https://
|
98
|
-
expect(options[:audience]).to eq('https://
|
101
|
+
expect(options[:token_credential_uri]).to eq('https://oauth2.googleapis.com/token')
|
102
|
+
expect(options[:audience]).to eq('https://oauth2.googleapis.com/token')
|
99
103
|
expect(options[:scope]).to eq(['http://example.com/scope'])
|
100
104
|
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
101
105
|
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
@@ -124,9 +128,10 @@ describe Google::Auth::Credentials, :private do
|
|
124
128
|
|
125
129
|
mocked_signet = double('Signet::OAuth2::Client')
|
126
130
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
131
|
+
allow(mocked_signet).to receive(:client_id)
|
127
132
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
128
|
-
expect(options[:token_credential_uri]).to eq('https://
|
129
|
-
expect(options[:audience]).to eq('https://
|
133
|
+
expect(options[:token_credential_uri]).to eq('https://oauth2.googleapis.com/token')
|
134
|
+
expect(options[:audience]).to eq('https://oauth2.googleapis.com/token')
|
130
135
|
expect(options[:scope]).to eq(['http://example.com/scope'])
|
131
136
|
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
132
137
|
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
@@ -154,9 +159,10 @@ describe Google::Auth::Credentials, :private do
|
|
154
159
|
|
155
160
|
mocked_signet = double('Signet::OAuth2::Client')
|
156
161
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
162
|
+
allow(mocked_signet).to receive(:client_id)
|
157
163
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
158
|
-
expect(options[:token_credential_uri]).to eq('https://
|
159
|
-
expect(options[:audience]).to eq('https://
|
164
|
+
expect(options[:token_credential_uri]).to eq('https://oauth2.googleapis.com/token')
|
165
|
+
expect(options[:audience]).to eq('https://oauth2.googleapis.com/token')
|
160
166
|
expect(options[:scope]).to eq(['http://example.com/scope'])
|
161
167
|
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
162
168
|
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
@@ -185,9 +191,10 @@ describe Google::Auth::Credentials, :private do
|
|
185
191
|
|
186
192
|
mocked_signet = double('Signet::OAuth2::Client')
|
187
193
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
194
|
+
allow(mocked_signet).to receive(:client_id)
|
188
195
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
189
|
-
expect(options[:token_credential_uri]).to eq('https://
|
190
|
-
expect(options[:audience]).to eq('https://
|
196
|
+
expect(options[:token_credential_uri]).to eq('https://oauth2.googleapis.com/token')
|
197
|
+
expect(options[:audience]).to eq('https://oauth2.googleapis.com/token')
|
191
198
|
expect(options[:scope]).to eq(['http://example.com/scope'])
|
192
199
|
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
193
200
|
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
@@ -215,6 +222,7 @@ describe Google::Auth::Credentials, :private do
|
|
215
222
|
|
216
223
|
mocked_signet = double('Signet::OAuth2::Client')
|
217
224
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
225
|
+
allow(mocked_signet).to receive(:client_id)
|
218
226
|
allow(Google::Auth).to receive(:get_application_default) do |scope|
|
219
227
|
expect(scope).to eq(TestCredentials::SCOPE)
|
220
228
|
|
@@ -223,8 +231,8 @@ describe Google::Auth::Credentials, :private do
|
|
223
231
|
default_keyfile_hash
|
224
232
|
end
|
225
233
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
226
|
-
expect(options[:token_credential_uri]).to eq('https://
|
227
|
-
expect(options[:audience]).to eq('https://
|
234
|
+
expect(options[:token_credential_uri]).to eq('https://oauth2.googleapis.com/token')
|
235
|
+
expect(options[:audience]).to eq('https://oauth2.googleapis.com/token')
|
228
236
|
expect(options[:scope]).to eq(['http://example.com/scope'])
|
229
237
|
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
230
238
|
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
@@ -236,4 +244,16 @@ describe Google::Auth::Credentials, :private do
|
|
236
244
|
expect(creds).to be_a_kind_of(TestCredentials)
|
237
245
|
expect(creds.client).to eq(mocked_signet)
|
238
246
|
end
|
247
|
+
|
248
|
+
it 'warns when cloud sdk credentials are used' do
|
249
|
+
mocked_signet = double('Signet::OAuth2::Client')
|
250
|
+
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
251
|
+
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
252
|
+
mocked_signet
|
253
|
+
end
|
254
|
+
allow(mocked_signet).to receive(:client_id).and_return(Google::Auth::CredentialsLoader::CLOUD_SDK_CLIENT_ID)
|
255
|
+
expect { Google::Auth::Credentials.new default_keyfile_hash }.to output(
|
256
|
+
Google::Auth::CredentialsLoader::CLOUD_SDK_CREDENTIALS_WARNING + "\n"
|
257
|
+
).to_stderr
|
258
|
+
end
|
239
259
|
end
|
@@ -63,7 +63,7 @@ describe '#get_application_default' do
|
|
63
63
|
Dir.mktmpdir do |dir|
|
64
64
|
key_path = File.join(dir, 'does-not-exist')
|
65
65
|
ENV[@var_name] = key_path
|
66
|
-
expect { Google::Auth.get_application_default
|
66
|
+
expect { Google::Auth.get_application_default @scope, options }
|
67
67
|
.to raise_error RuntimeError
|
68
68
|
end
|
69
69
|
end
|
@@ -76,7 +76,7 @@ describe '#get_application_default' do
|
|
76
76
|
ENV.delete(@var_name) unless ENV[@var_name].nil? # no env var
|
77
77
|
ENV['HOME'] = dir # no config present in this tmp dir
|
78
78
|
expect do
|
79
|
-
Google::Auth.get_application_default
|
79
|
+
Google::Auth.get_application_default @scope, options
|
80
80
|
end.to raise_error RuntimeError
|
81
81
|
end
|
82
82
|
expect(stub).to have_been_requested
|
@@ -90,7 +90,7 @@ describe '#get_application_default' do
|
|
90
90
|
FileUtils.mkdir_p(File.dirname(key_path))
|
91
91
|
File.write(key_path, cred_json_text)
|
92
92
|
ENV[@var_name] = key_path
|
93
|
-
expect(Google::Auth.get_application_default
|
93
|
+
expect(Google::Auth.get_application_default @scope, options)
|
94
94
|
.to_not be_nil
|
95
95
|
end
|
96
96
|
end
|
@@ -102,7 +102,7 @@ describe '#get_application_default' do
|
|
102
102
|
FileUtils.mkdir_p(File.dirname(key_path))
|
103
103
|
File.write(key_path, cred_json_text)
|
104
104
|
ENV['HOME'] = dir
|
105
|
-
expect(Google::Auth.get_application_default
|
105
|
+
expect(Google::Auth.get_application_default @scope, options)
|
106
106
|
.to_not be_nil
|
107
107
|
end
|
108
108
|
end
|
@@ -114,7 +114,7 @@ describe '#get_application_default' do
|
|
114
114
|
FileUtils.mkdir_p(File.dirname(key_path))
|
115
115
|
File.write(key_path, cred_json_text)
|
116
116
|
ENV['HOME'] = dir
|
117
|
-
expect(Google::Auth.get_application_default
|
117
|
+
expect(Google::Auth.get_application_default nil, options).to_not be_nil
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
@@ -125,7 +125,7 @@ describe '#get_application_default' do
|
|
125
125
|
Dir.mktmpdir do |dir|
|
126
126
|
ENV.delete(@var_name) unless ENV[@var_name].nil? # no env var
|
127
127
|
ENV['HOME'] = dir # no config present in this tmp dir
|
128
|
-
creds = Google::Auth.get_application_default
|
128
|
+
creds = Google::Auth.get_application_default @scope, options
|
129
129
|
expect(creds).to_not be_nil
|
130
130
|
end
|
131
131
|
expect(stub).to have_been_requested
|
@@ -137,7 +137,7 @@ describe '#get_application_default' do
|
|
137
137
|
key_path = File.join('/etc/google/auth/', CREDENTIALS_FILE_NAME)
|
138
138
|
FileUtils.mkdir_p(File.dirname(key_path))
|
139
139
|
File.write(key_path, cred_json_text)
|
140
|
-
expect(Google::Auth.get_application_default
|
140
|
+
expect(Google::Auth.get_application_default @scope, options)
|
141
141
|
.to_not be_nil
|
142
142
|
File.delete(key_path)
|
143
143
|
end
|
@@ -151,9 +151,22 @@ describe '#get_application_default' do
|
|
151
151
|
ENV[CLIENT_SECRET_VAR] = cred_json[:client_secret]
|
152
152
|
ENV[REFRESH_TOKEN_VAR] = cred_json[:refresh_token]
|
153
153
|
ENV[ACCOUNT_TYPE_VAR] = cred_json[:type]
|
154
|
-
expect(Google::Auth.get_application_default
|
154
|
+
expect(Google::Auth.get_application_default @scope, options)
|
155
155
|
.to_not be_nil
|
156
156
|
end
|
157
|
+
|
158
|
+
it 'warns when using cloud sdk credentials' do
|
159
|
+
ENV.delete(@var_name) unless ENV[@var_name].nil? # no env var
|
160
|
+
ENV[PRIVATE_KEY_VAR] = cred_json[:private_key]
|
161
|
+
ENV[CLIENT_EMAIL_VAR] = cred_json[:client_email]
|
162
|
+
ENV[CLIENT_ID_VAR] = Google::Auth::CredentialsLoader::CLOUD_SDK_CLIENT_ID
|
163
|
+
ENV[CLIENT_SECRET_VAR] = cred_json[:client_secret]
|
164
|
+
ENV[REFRESH_TOKEN_VAR] = cred_json[:refresh_token]
|
165
|
+
ENV[ACCOUNT_TYPE_VAR] = cred_json[:type]
|
166
|
+
expect { Google::Auth.get_application_default @scope, options }.to output(
|
167
|
+
Google::Auth::CredentialsLoader::CLOUD_SDK_CREDENTIALS_WARNING + "\n"
|
168
|
+
).to_stderr
|
169
|
+
end
|
157
170
|
end
|
158
171
|
|
159
172
|
describe 'when credential type is service account' do
|
@@ -216,7 +229,7 @@ describe '#get_application_default' do
|
|
216
229
|
File.write(key_path, cred_json_text)
|
217
230
|
ENV[@var_name] = key_path
|
218
231
|
expect do
|
219
|
-
Google::Auth.get_application_default
|
232
|
+
Google::Auth.get_application_default @scope, options
|
220
233
|
end.to raise_error RuntimeError
|
221
234
|
end
|
222
235
|
end
|
@@ -229,7 +242,7 @@ describe '#get_application_default' do
|
|
229
242
|
File.write(key_path, cred_json_text)
|
230
243
|
ENV['HOME'] = dir
|
231
244
|
expect do
|
232
|
-
Google::Auth.get_application_default
|
245
|
+
Google::Auth.get_application_default @scope, options
|
233
246
|
end.to raise_error RuntimeError
|
234
247
|
end
|
235
248
|
end
|
@@ -238,7 +251,7 @@ describe '#get_application_default' do
|
|
238
251
|
ENV[PRIVATE_KEY_VAR] = cred_json[:private_key]
|
239
252
|
ENV[CLIENT_EMAIL_VAR] = cred_json[:client_email]
|
240
253
|
expect do
|
241
|
-
Google::Auth.get_application_default
|
254
|
+
Google::Auth.get_application_default @scope, options
|
242
255
|
end.to raise_error RuntimeError
|
243
256
|
end
|
244
257
|
end
|
@@ -211,6 +211,13 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
211
211
|
ENV[CLIENT_EMAIL_VAR] = cred_json[:client_email]
|
212
212
|
expect(@clz.from_env(@scope)).to_not be_nil
|
213
213
|
end
|
214
|
+
|
215
|
+
it 'succeeds when GOOGLE_PRIVATE_KEY is escaped' do
|
216
|
+
escaped_key = cred_json[:private_key].gsub "\n", '\n'
|
217
|
+
ENV[PRIVATE_KEY_VAR] = "\"#{escaped_key}\""
|
218
|
+
ENV[CLIENT_EMAIL_VAR] = cred_json[:client_email]
|
219
|
+
expect(@clz.from_env(@scope)).to_not be_nil
|
220
|
+
end
|
214
221
|
end
|
215
222
|
|
216
223
|
describe '#from_well_known_path' do
|
@@ -41,10 +41,10 @@ describe Signet::OAuth2::Client do
|
|
41
41
|
before(:example) do
|
42
42
|
@key = OpenSSL::PKey::RSA.new(2048)
|
43
43
|
@client = Signet::OAuth2::Client.new(
|
44
|
-
token_credential_uri: 'https://
|
44
|
+
token_credential_uri: 'https://oauth2.googleapis.com/token',
|
45
45
|
scope: 'https://www.googleapis.com/auth/userinfo.profile',
|
46
46
|
issuer: 'app@example.com',
|
47
|
-
audience: 'https://
|
47
|
+
audience: 'https://oauth2.googleapis.com/token',
|
48
48
|
signing_key: @key
|
49
49
|
)
|
50
50
|
end
|
@@ -60,7 +60,7 @@ describe Signet::OAuth2::Client do
|
|
60
60
|
@key.public_key, true,
|
61
61
|
algorithm: 'RS256')
|
62
62
|
end
|
63
|
-
stub_request(:post, 'https://
|
63
|
+
stub_request(:post, 'https://oauth2.googleapis.com/token')
|
64
64
|
.with(body: hash_including(
|
65
65
|
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer'
|
66
66
|
), &blk)
|
@@ -242,7 +242,7 @@ describe Google::Auth::UserAuthorizer do
|
|
242
242
|
end
|
243
243
|
|
244
244
|
before(:example) do
|
245
|
-
stub_request(:post, 'https://
|
245
|
+
stub_request(:post, 'https://oauth2.googleapis.com/token')
|
246
246
|
.to_return(body: token_json, status: 200, headers: {
|
247
247
|
'Content-Type' => 'application/json'
|
248
248
|
})
|
@@ -270,7 +270,7 @@ describe Google::Auth::UserAuthorizer do
|
|
270
270
|
|
271
271
|
context 'with invalid authorization code' do
|
272
272
|
before(:example) do
|
273
|
-
stub_request(:post, 'https://
|
273
|
+
stub_request(:post, 'https://oauth2.googleapis.com/token')
|
274
274
|
.to_return(status: 400)
|
275
275
|
end
|
276
276
|
|
@@ -300,7 +300,7 @@ describe Google::Auth::UserAuthorizer do
|
|
300
300
|
before(:example) do
|
301
301
|
token_store.store('user1', token_json)
|
302
302
|
stub_request(
|
303
|
-
:get, 'https://
|
303
|
+
:get, 'https://oauth2.googleapis.com/revoke?token=refreshtoken'
|
304
304
|
)
|
305
305
|
.to_return(status: 200)
|
306
306
|
end
|
@@ -308,7 +308,7 @@ describe Google::Auth::UserAuthorizer do
|
|
308
308
|
it 'should revoke the grant' do
|
309
309
|
authorizer.revoke_authorization('user1')
|
310
310
|
expect(a_request(
|
311
|
-
:get, 'https://
|
311
|
+
:get, 'https://oauth2.googleapis.com/revoke?token=refreshtoken'
|
312
312
|
))
|
313
313
|
.to have_been_made
|
314
314
|
end
|
@@ -68,7 +68,7 @@ describe Google::Auth::UserRefreshCredentials do
|
|
68
68
|
body = MultiJson.dump('access_token' => access_token,
|
69
69
|
'token_type' => 'Bearer',
|
70
70
|
'expires_in' => 3600)
|
71
|
-
stub_request(:post, 'https://
|
71
|
+
stub_request(:post, 'https://oauth2.googleapis.com/token')
|
72
72
|
.with(body: hash_including('grant_type' => 'refresh_token'))
|
73
73
|
.to_return(body: body,
|
74
74
|
status: 200,
|
@@ -246,7 +246,7 @@ describe Google::Auth::UserRefreshCredentials do
|
|
246
246
|
|
247
247
|
describe 'when revoking a refresh token' do
|
248
248
|
let(:stub) do
|
249
|
-
stub_request(:get, 'https://
|
249
|
+
stub_request(:get, 'https://oauth2.googleapis.com/revoke' \
|
250
250
|
'?token=refreshtoken')
|
251
251
|
.to_return(status: 200,
|
252
252
|
headers: { 'Content-Type' => 'application/json' })
|
@@ -262,7 +262,7 @@ describe Google::Auth::UserRefreshCredentials do
|
|
262
262
|
|
263
263
|
describe 'when revoking an access token' do
|
264
264
|
let(:stub) do
|
265
|
-
stub_request(:get, 'https://
|
265
|
+
stub_request(:get, 'https://oauth2.googleapis.com/revoke' \
|
266
266
|
'?token=accesstoken')
|
267
267
|
.to_return(status: 200,
|
268
268
|
headers: { 'Content-Type' => 'application/json' })
|
@@ -280,7 +280,7 @@ describe Google::Auth::UserRefreshCredentials do
|
|
280
280
|
|
281
281
|
describe 'when revoking an invalid token' do
|
282
282
|
let(:stub) do
|
283
|
-
stub_request(:get, 'https://
|
283
|
+
stub_request(:get, 'https://oauth2.googleapis.com/revoke' \
|
284
284
|
'?token=refreshtoken')
|
285
285
|
.to_return(status: 400,
|
286
286
|
headers: { 'Content-Type' => 'application/json' })
|
@@ -294,7 +294,7 @@ describe Google::Auth::UserRefreshCredentials do
|
|
294
294
|
end
|
295
295
|
end
|
296
296
|
|
297
|
-
describe 'when
|
297
|
+
describe 'when errors occurred with request' do
|
298
298
|
it 'should fail with Signet::AuthorizationError if request times out' do
|
299
299
|
allow_any_instance_of(Faraday::Connection).to receive(:get)
|
300
300
|
.and_raise(Faraday::TimeoutError)
|
@@ -107,7 +107,7 @@ describe Google::Auth::WebUserAuthorizer do
|
|
107
107
|
end
|
108
108
|
|
109
109
|
before(:example) do
|
110
|
-
stub_request(:post, 'https://
|
110
|
+
stub_request(:post, 'https://oauth2.googleapis.com/token')
|
111
111
|
.to_return(body: token_json,
|
112
112
|
status: 200,
|
113
113
|
headers: { 'Content-Type' => 'application/json' })
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: googleauth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Emiola
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.12'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: logging
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.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.0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: jwt
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,16 +76,22 @@ dependencies:
|
|
90
76
|
name: os
|
91
77
|
requirement: !ruby/object:Gem::Requirement
|
92
78
|
requirements:
|
93
|
-
- - "
|
79
|
+
- - ">="
|
94
80
|
- !ruby/object:Gem::Version
|
95
81
|
version: '0.9'
|
82
|
+
- - "<"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '2.0'
|
96
85
|
type: :runtime
|
97
86
|
prerelease: false
|
98
87
|
version_requirements: !ruby/object:Gem::Requirement
|
99
88
|
requirements:
|
100
|
-
- - "
|
89
|
+
- - ">="
|
101
90
|
- !ruby/object:Gem::Version
|
102
91
|
version: '0.9'
|
92
|
+
- - "<"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '2.0'
|
103
95
|
- !ruby/object:Gem::Dependency
|
104
96
|
name: signet
|
105
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,6 +120,7 @@ files:
|
|
128
120
|
- ".rubocop.yml"
|
129
121
|
- ".travis.yml"
|
130
122
|
- CHANGELOG.md
|
123
|
+
- CODE_OF_CONDUCT.md
|
131
124
|
- CONTRIBUTING.md
|
132
125
|
- COPYING
|
133
126
|
- Gemfile
|
@@ -142,6 +135,7 @@ files:
|
|
142
135
|
- lib/googleauth/credentials_loader.rb
|
143
136
|
- lib/googleauth/default_credentials.rb
|
144
137
|
- lib/googleauth/iam.rb
|
138
|
+
- lib/googleauth/json_key_reader.rb
|
145
139
|
- lib/googleauth/scope_util.rb
|
146
140
|
- lib/googleauth/service_account.rb
|
147
141
|
- lib/googleauth/signet.rb
|
@@ -188,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
188
182
|
version: '0'
|
189
183
|
requirements: []
|
190
184
|
rubyforge_project:
|
191
|
-
rubygems_version: 2.
|
185
|
+
rubygems_version: 2.7.6
|
192
186
|
signing_key:
|
193
187
|
specification_version: 4
|
194
188
|
summary: Google Auth Library for Ruby
|