googleauth 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +0 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
- data/.github/ISSUE_TEMPLATE/support_request.md +7 -0
- data/.kokoro/build.sh +1 -1
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +5 -0
- data/lib/googleauth/application_default.rb +14 -4
- data/lib/googleauth/compute_engine.rb +2 -3
- data/lib/googleauth/credentials.rb +18 -18
- data/lib/googleauth/credentials_loader.rb +53 -9
- data/lib/googleauth/default_credentials.rb +4 -4
- data/lib/googleauth/service_account.rb +1 -0
- data/lib/googleauth/signet.rb +20 -0
- data/lib/googleauth/user_refresh.rb +1 -0
- data/lib/googleauth/version.rb +1 -1
- data/spec/googleauth/credentials_spec.rb +8 -0
- data/spec/googleauth/get_application_default_spec.rb +13 -0
- data/spec/googleauth/service_account_spec.rb +34 -0
- data/spec/googleauth/signet_spec.rb +34 -3
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e646bac53d9ec3282d73ffc1110581dbd52a36d89a5ad3e78d2d7b6cb998f6c
|
4
|
+
data.tar.gz: ed9f5ff32c8a8093dbfba02266c2f50544572dda9ed5e77e081ff6eabdcd2ac4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4bf425795f1274eee8197d50bf2d8ec433881eee828081ee8e4ec6b078357b6a1c1a72b177dd81e0fa91170f0aad69dc5c937e134b813215caec095630259bd
|
7
|
+
data.tar.gz: 216d5d6ae1dbc594247686eec49447a3a7a3dac7ccea3d5245ee6571ae446c1186bfd7ac41223f8d0f325abe5b444162a66248c4b2c8bc5e5d5cf5b3a4e5ff67
|
File without changes
|
@@ -0,0 +1,36 @@
|
|
1
|
+
---
|
2
|
+
name: Bug report
|
3
|
+
about: Create a report to help us improve
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
Thanks for stopping by to let us know something could be better!
|
8
|
+
|
9
|
+
**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response.
|
10
|
+
|
11
|
+
Please run down the following list and make sure you've tried the usual "quick fixes":
|
12
|
+
|
13
|
+
- Search the issues already opened: https://github.com/googleapis/google-auth-library-ruby/issues
|
14
|
+
- Search Stack Overflow: https://stackoverflow.com/questions/tagged/google-auth-library-ruby
|
15
|
+
|
16
|
+
If you are still having issues, please be sure to include as much information as possible:
|
17
|
+
|
18
|
+
#### Environment details
|
19
|
+
|
20
|
+
- OS:
|
21
|
+
- Ruby version:
|
22
|
+
- Gem name and version:
|
23
|
+
|
24
|
+
#### Steps to reproduce
|
25
|
+
|
26
|
+
1. ...
|
27
|
+
|
28
|
+
#### Code example
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
# example
|
32
|
+
```
|
33
|
+
|
34
|
+
Making sure to follow these steps will guarantee the quickest resolution possible.
|
35
|
+
|
36
|
+
Thanks!
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
name: Feature request
|
3
|
+
about: Suggest an idea for this library
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
Thanks for stopping by to let us know something could be better!
|
8
|
+
|
9
|
+
**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response.
|
10
|
+
|
11
|
+
**Is your feature request related to a problem? Please describe.**
|
12
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
13
|
+
|
14
|
+
**Describe the solution you'd like**
|
15
|
+
A clear and concise description of what you want to happen.
|
16
|
+
|
17
|
+
**Describe alternatives you've considered**
|
18
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
19
|
+
|
20
|
+
**Additional context**
|
21
|
+
Add any other context or screenshots about the feature request here.
|
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
name: Support request
|
3
|
+
about: If you have a support contract with Google, please create an issue in the Google Cloud Support console.
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response.
|
data/.kokoro/build.sh
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## 0.8.0 (2019/01/02)
|
2
|
+
|
3
|
+
* Support connection options :default_connection and :connection_builder when creating credentials that need to refresh OAuth tokens. This lets clients provide connection objects with custom settings, such as proxies, needed for the client environment.
|
4
|
+
* Removed an unnecessary warning about project IDs.
|
5
|
+
|
1
6
|
## 0.7.1 (2018/10/25)
|
2
7
|
|
3
8
|
* Make load_gcloud_project_id module function.
|
@@ -52,11 +52,21 @@ ERROR_MESSAGE
|
|
52
52
|
# scope is ignored.
|
53
53
|
#
|
54
54
|
# @param scope [string|array|nil] the scope(s) to access
|
55
|
-
# @param options [
|
55
|
+
# @param options [Hash] Connection options. These may be used to configure
|
56
|
+
# the `Faraday::Connection` used for outgoing HTTP requests. For
|
57
|
+
# example, if a connection proxy must be used in the current network,
|
58
|
+
# you may provide a connection with with the needed proxy options.
|
59
|
+
# The following keys are recognized:
|
60
|
+
# * `:default_connection` The connection object to use for token
|
61
|
+
# refresh requests.
|
62
|
+
# * `:connection_builder` A `Proc` that creates and returns a
|
63
|
+
# connection to use for token refresh requests.
|
64
|
+
# * `:connection` The connection to use to determine whether GCE
|
65
|
+
# metadata credentials are available.
|
56
66
|
def get_application_default(scope = nil, options = {})
|
57
|
-
creds = DefaultCredentials.from_env(scope) ||
|
58
|
-
DefaultCredentials.from_well_known_path(scope) ||
|
59
|
-
DefaultCredentials.from_system_default_path(scope)
|
67
|
+
creds = DefaultCredentials.from_env(scope, options) ||
|
68
|
+
DefaultCredentials.from_well_known_path(scope, options) ||
|
69
|
+
DefaultCredentials.from_system_default_path(scope, options)
|
60
70
|
return creds unless creds.nil?
|
61
71
|
unless GCECredentials.on_gce?(options)
|
62
72
|
# Clear cache of the result of GCECredentials.on_gce?
|
@@ -87,10 +87,9 @@ ERROR
|
|
87
87
|
# fetched.
|
88
88
|
def fetch_access_token(options = {})
|
89
89
|
c = options[:connection] || Faraday.default_connection
|
90
|
-
c.headers = { 'Metadata-Flavor' => 'Google' }
|
91
|
-
|
92
90
|
retry_with_error do
|
93
|
-
|
91
|
+
headers = { 'Metadata-Flavor' => 'Google' }
|
92
|
+
resp = c.get(COMPUTE_AUTH_TOKEN_URI, nil, headers)
|
94
93
|
case resp.status
|
95
94
|
when 200
|
96
95
|
Signet::OAuth2.parse_credentials(resp.body,
|
@@ -66,14 +66,14 @@ module Google
|
|
66
66
|
elsif keyfile.is_a? Hash
|
67
67
|
hash = stringify_hash_keys keyfile
|
68
68
|
hash['scope'] ||= scope
|
69
|
-
@client = init_client hash
|
69
|
+
@client = init_client hash, options
|
70
70
|
@project_id ||= (hash['project_id'] || hash['project'])
|
71
71
|
else
|
72
72
|
verify_keyfile_exists! keyfile
|
73
73
|
json = JSON.parse ::File.read(keyfile)
|
74
74
|
json['scope'] ||= scope
|
75
75
|
@project_id ||= (json['project_id'] || json['project'])
|
76
|
-
@client = init_client json
|
76
|
+
@client = init_client json, options
|
77
77
|
end
|
78
78
|
CredentialsLoader.warn_if_cloud_sdk_credentials @client.client_id
|
79
79
|
@project_id ||= CredentialsLoader.load_gcloud_project_id
|
@@ -85,33 +85,32 @@ module Google
|
|
85
85
|
# previously stated locations do not contain keyfile information,
|
86
86
|
# this method defaults to use the application default.
|
87
87
|
def self.default(options = {})
|
88
|
-
scope = options[:scope]
|
89
88
|
# First try to find keyfile file from environment variables.
|
90
|
-
client = from_path_vars
|
89
|
+
client = from_path_vars options
|
91
90
|
|
92
91
|
# Second try to find keyfile json from environment variables.
|
93
|
-
client ||= from_json_vars
|
92
|
+
client ||= from_json_vars options
|
94
93
|
|
95
94
|
# Third try to find keyfile file from known file paths.
|
96
|
-
client ||= from_default_paths
|
95
|
+
client ||= from_default_paths options
|
97
96
|
|
98
97
|
# Finally get instantiated client from Google::Auth
|
99
|
-
client ||= from_application_default
|
98
|
+
client ||= from_application_default options
|
100
99
|
client
|
101
100
|
end
|
102
101
|
|
103
|
-
def self.from_path_vars(
|
102
|
+
def self.from_path_vars(options)
|
104
103
|
self::PATH_ENV_VARS
|
105
104
|
.map { |v| ENV[v] }
|
106
105
|
.compact
|
107
106
|
.select { |p| ::File.file? p }
|
108
107
|
.each do |file|
|
109
|
-
return new file,
|
108
|
+
return new file, options
|
110
109
|
end
|
111
110
|
nil
|
112
111
|
end
|
113
112
|
|
114
|
-
def self.from_json_vars(
|
113
|
+
def self.from_json_vars(options)
|
115
114
|
json = lambda do |v|
|
116
115
|
unless ENV[v].nil?
|
117
116
|
begin
|
@@ -122,24 +121,24 @@ module Google
|
|
122
121
|
end
|
123
122
|
end
|
124
123
|
self::JSON_ENV_VARS.map(&json).compact.each do |hash|
|
125
|
-
return new hash,
|
124
|
+
return new hash, options
|
126
125
|
end
|
127
126
|
nil
|
128
127
|
end
|
129
128
|
|
130
|
-
def self.from_default_paths(
|
129
|
+
def self.from_default_paths(options)
|
131
130
|
self::DEFAULT_PATHS
|
132
131
|
.select { |p| ::File.file? p }
|
133
132
|
.each do |file|
|
134
|
-
return new file,
|
133
|
+
return new file, options
|
135
134
|
end
|
136
135
|
nil
|
137
136
|
end
|
138
137
|
|
139
|
-
def self.from_application_default(
|
140
|
-
scope
|
138
|
+
def self.from_application_default(options)
|
139
|
+
scope = options[:scope] || self::SCOPE
|
141
140
|
client = Google::Auth.get_application_default scope
|
142
|
-
new client
|
141
|
+
new client, options
|
143
142
|
end
|
144
143
|
private_class_method :from_path_vars,
|
145
144
|
:from_json_vars,
|
@@ -161,9 +160,10 @@ module Google
|
|
161
160
|
end
|
162
161
|
|
163
162
|
# Initializes the Signet client.
|
164
|
-
def init_client(keyfile)
|
163
|
+
def init_client(keyfile, connection_options = {})
|
165
164
|
client_opts = client_options keyfile
|
166
|
-
Signet::OAuth2::Client.new
|
165
|
+
Signet::OAuth2::Client.new(client_opts)
|
166
|
+
.configure_connection(connection_options)
|
167
167
|
end
|
168
168
|
|
169
169
|
# returns a new Hash with string keys instead of symbol keys.
|
@@ -76,22 +76,35 @@ module Google
|
|
76
76
|
# By default, it calls #new on the current class, but this behaviour can
|
77
77
|
# be modified, allowing different instances to be created.
|
78
78
|
def make_creds(*args)
|
79
|
-
new(*args)
|
79
|
+
creds = new(*args)
|
80
|
+
if creds.respond_to?(:configure_connection) && args.size == 1
|
81
|
+
creds = creds.configure_connection(args[0])
|
82
|
+
end
|
83
|
+
creds
|
80
84
|
end
|
81
85
|
|
82
86
|
# Creates an instance from the path specified in an environment
|
83
87
|
# variable.
|
84
88
|
#
|
85
89
|
# @param scope [string|array|nil] the scope(s) to access
|
86
|
-
|
90
|
+
# @param options [Hash] Connection options. These may be used to configure
|
91
|
+
# how OAuth tokens are retrieved, by providing a suitable
|
92
|
+
# `Faraday::Connection`. For example, if a connection proxy must be
|
93
|
+
# used in the current network, you may provide a connection with
|
94
|
+
# with the needed proxy options.
|
95
|
+
# The following keys are recognized:
|
96
|
+
# * `:default_connection` The connection object to use.
|
97
|
+
# * `:connection_builder` A `Proc` that returns a connection.
|
98
|
+
def from_env(scope = nil, options = {})
|
99
|
+
options = interpret_options scope, options
|
87
100
|
if ENV.key?(ENV_VAR)
|
88
101
|
path = ENV[ENV_VAR]
|
89
102
|
raise "file #{path} does not exist" unless File.exist?(path)
|
90
103
|
File.open(path) do |f|
|
91
|
-
return make_creds(json_key_io: f
|
104
|
+
return make_creds(options.merge(json_key_io: f))
|
92
105
|
end
|
93
106
|
elsif service_account_env_vars? || authorized_user_env_vars?
|
94
|
-
return make_creds(
|
107
|
+
return make_creds(options)
|
95
108
|
end
|
96
109
|
rescue StandardError => e
|
97
110
|
raise "#{NOT_FOUND_ERROR}: #{e}"
|
@@ -100,7 +113,16 @@ module Google
|
|
100
113
|
# Creates an instance from a well known path.
|
101
114
|
#
|
102
115
|
# @param scope [string|array|nil] the scope(s) to access
|
103
|
-
|
116
|
+
# @param options [Hash] Connection options. These may be used to configure
|
117
|
+
# how OAuth tokens are retrieved, by providing a suitable
|
118
|
+
# `Faraday::Connection`. For example, if a connection proxy must be
|
119
|
+
# used in the current network, you may provide a connection with
|
120
|
+
# with the needed proxy options.
|
121
|
+
# The following keys are recognized:
|
122
|
+
# * `:default_connection` The connection object to use.
|
123
|
+
# * `:connection_builder` A `Proc` that returns a connection.
|
124
|
+
def from_well_known_path(scope = nil, options = {})
|
125
|
+
options = interpret_options scope, options
|
104
126
|
home_var = OS.windows? ? 'APPDATA' : 'HOME'
|
105
127
|
base = WELL_KNOWN_PATH
|
106
128
|
root = ENV[home_var].nil? ? '' : ENV[home_var]
|
@@ -108,7 +130,7 @@ module Google
|
|
108
130
|
path = File.join(root, base)
|
109
131
|
return nil unless File.exist?(path)
|
110
132
|
File.open(path) do |f|
|
111
|
-
return make_creds(json_key_io: f
|
133
|
+
return make_creds(options.merge(json_key_io: f))
|
112
134
|
end
|
113
135
|
rescue StandardError => e
|
114
136
|
raise "#{WELL_KNOWN_ERROR}: #{e}"
|
@@ -117,7 +139,16 @@ module Google
|
|
117
139
|
# Creates an instance from the system default path
|
118
140
|
#
|
119
141
|
# @param scope [string|array|nil] the scope(s) to access
|
120
|
-
|
142
|
+
# @param options [Hash] Connection options. These may be used to configure
|
143
|
+
# how OAuth tokens are retrieved, by providing a suitable
|
144
|
+
# `Faraday::Connection`. For example, if a connection proxy must be
|
145
|
+
# used in the current network, you may provide a connection with
|
146
|
+
# with the needed proxy options.
|
147
|
+
# The following keys are recognized:
|
148
|
+
# * `:default_connection` The connection object to use.
|
149
|
+
# * `:connection_builder` A `Proc` that returns a connection.
|
150
|
+
def from_system_default_path(scope = nil, options = {})
|
151
|
+
options = interpret_options scope, options
|
121
152
|
if OS.windows?
|
122
153
|
return nil unless ENV['ProgramData']
|
123
154
|
prefix = File.join(ENV['ProgramData'], 'Google/Auth')
|
@@ -127,7 +158,7 @@ module Google
|
|
127
158
|
path = File.join(prefix, CREDENTIALS_FILE_NAME)
|
128
159
|
return nil unless File.exist?(path)
|
129
160
|
File.open(path) do |f|
|
130
|
-
return make_creds(json_key_io: f
|
161
|
+
return make_creds(options.merge(json_key_io: f))
|
131
162
|
end
|
132
163
|
rescue StandardError => e
|
133
164
|
raise "#{SYSTEM_DEFAULT_ERROR}: #{e}"
|
@@ -139,18 +170,31 @@ module Google
|
|
139
170
|
end
|
140
171
|
module_function :warn_if_cloud_sdk_credentials
|
141
172
|
|
173
|
+
# Finds project_id from gcloud CLI configuration
|
142
174
|
def load_gcloud_project_id
|
143
175
|
gcloud = GCLOUD_WINDOWS_COMMAND if OS.windows?
|
144
176
|
gcloud = GCLOUD_POSIX_COMMAND unless OS.windows?
|
145
177
|
config = MultiJson.load(`#{gcloud} #{GCLOUD_CONFIG_COMMAND}`)
|
146
178
|
config['configuration']['properties']['core']['project']
|
147
179
|
rescue
|
148
|
-
|
180
|
+
nil
|
149
181
|
end
|
150
182
|
module_function :load_gcloud_project_id
|
151
183
|
|
152
184
|
private
|
153
185
|
|
186
|
+
def interpret_options(scope, options)
|
187
|
+
if scope.is_a? Hash
|
188
|
+
options = scope
|
189
|
+
scope = nil
|
190
|
+
end
|
191
|
+
if scope && !options[:scope]
|
192
|
+
options.merge(scope: scope)
|
193
|
+
else
|
194
|
+
options
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
154
198
|
def service_account_env_vars?
|
155
199
|
([PRIVATE_KEY_VAR, CLIENT_EMAIL_VAR] - ENV.keys).empty?
|
156
200
|
end
|
@@ -46,16 +46,16 @@ module Google
|
|
46
46
|
# override CredentialsLoader#make_creds to use the class determined by
|
47
47
|
# loading the json.
|
48
48
|
def self.make_creds(options = {})
|
49
|
-
json_key_io
|
49
|
+
json_key_io = options[:json_key_io]
|
50
50
|
if json_key_io
|
51
51
|
json_key, clz = determine_creds_class(json_key_io)
|
52
52
|
warn_if_cloud_sdk_credentials json_key['client_id']
|
53
|
-
|
54
|
-
|
53
|
+
io = StringIO.new(MultiJson.dump(json_key))
|
54
|
+
clz.make_creds(options.merge(json_key_io: io))
|
55
55
|
else
|
56
56
|
warn_if_cloud_sdk_credentials ENV[CredentialsLoader::CLIENT_ID_VAR]
|
57
57
|
clz = read_creds
|
58
|
-
clz.make_creds(
|
58
|
+
clz.make_creds(options)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
data/lib/googleauth/signet.rb
CHANGED
@@ -38,6 +38,12 @@ module Signet
|
|
38
38
|
# This reopens Client to add #apply and #apply! methods which update a
|
39
39
|
# hash with the fetched authentication token.
|
40
40
|
class Client
|
41
|
+
def configure_connection(options)
|
42
|
+
@connection_info =
|
43
|
+
options[:connection_builder] || options[:default_connection]
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
41
47
|
# Updates a_hash updated with the authentication token
|
42
48
|
def apply!(a_hash, opts = {})
|
43
49
|
# fetch the access token there is currently not one, or if the client
|
@@ -66,6 +72,10 @@ module Signet
|
|
66
72
|
|
67
73
|
alias orig_fetch_access_token! fetch_access_token!
|
68
74
|
def fetch_access_token!(options = {})
|
75
|
+
unless options[:connection]
|
76
|
+
connection = build_default_connection
|
77
|
+
options = options.merge(connection: connection) if connection
|
78
|
+
end
|
69
79
|
info = orig_fetch_access_token!(options)
|
70
80
|
notify_refresh_listeners
|
71
81
|
info
|
@@ -78,6 +88,16 @@ module Signet
|
|
78
88
|
end
|
79
89
|
end
|
80
90
|
|
91
|
+
def build_default_connection
|
92
|
+
if !defined?(@connection_info)
|
93
|
+
nil
|
94
|
+
elsif @connection_info.respond_to? :call
|
95
|
+
@connection_info.call
|
96
|
+
else
|
97
|
+
@connection_info
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
81
101
|
def retry_with_error(max_retry_count = 5)
|
82
102
|
retry_count = 0
|
83
103
|
|
data/lib/googleauth/version.rb
CHANGED
@@ -47,6 +47,7 @@ describe Google::Auth::Credentials, :private do
|
|
47
47
|
|
48
48
|
it 'uses a default scope' do
|
49
49
|
mocked_signet = double('Signet::OAuth2::Client')
|
50
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
50
51
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
51
52
|
allow(mocked_signet).to receive(:client_id)
|
52
53
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
@@ -64,6 +65,7 @@ describe Google::Auth::Credentials, :private do
|
|
64
65
|
|
65
66
|
it 'uses a custom scope' do
|
66
67
|
mocked_signet = double('Signet::OAuth2::Client')
|
68
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
67
69
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
68
70
|
allow(mocked_signet).to receive(:client_id)
|
69
71
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
@@ -96,6 +98,7 @@ describe Google::Auth::Credentials, :private do
|
|
96
98
|
allow(::File).to receive(:file?).with(TEST_PATH_ENV_VAL) { false }
|
97
99
|
|
98
100
|
mocked_signet = double('Signet::OAuth2::Client')
|
101
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
99
102
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
100
103
|
allow(mocked_signet).to receive(:client_id)
|
101
104
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
@@ -129,6 +132,7 @@ describe Google::Auth::Credentials, :private do
|
|
129
132
|
allow(::File).to receive(:read).with('/unknown/path/to/file.txt') { JSON.generate(default_keyfile_hash) }
|
130
133
|
|
131
134
|
mocked_signet = double('Signet::OAuth2::Client')
|
135
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
132
136
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
133
137
|
allow(mocked_signet).to receive(:client_id)
|
134
138
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
@@ -161,6 +165,7 @@ describe Google::Auth::Credentials, :private do
|
|
161
165
|
allow(::ENV).to receive(:[]).with('JSON_ENV_TEST') { JSON.generate(default_keyfile_hash) }
|
162
166
|
|
163
167
|
mocked_signet = double('Signet::OAuth2::Client')
|
168
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
164
169
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
165
170
|
allow(mocked_signet).to receive(:client_id)
|
166
171
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
@@ -194,6 +199,7 @@ describe Google::Auth::Credentials, :private do
|
|
194
199
|
allow(::File).to receive(:read).with('~/default/path/to/file.txt') { JSON.generate(default_keyfile_hash) }
|
195
200
|
|
196
201
|
mocked_signet = double('Signet::OAuth2::Client')
|
202
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
197
203
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
198
204
|
allow(mocked_signet).to receive(:client_id)
|
199
205
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
@@ -226,6 +232,7 @@ describe Google::Auth::Credentials, :private do
|
|
226
232
|
allow(::File).to receive(:file?).with('~/default/path/to/file.txt') { false }
|
227
233
|
|
228
234
|
mocked_signet = double('Signet::OAuth2::Client')
|
235
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
229
236
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
230
237
|
allow(mocked_signet).to receive(:client_id)
|
231
238
|
allow(Google::Auth).to receive(:get_application_default) do |scope|
|
@@ -253,6 +260,7 @@ describe Google::Auth::Credentials, :private do
|
|
253
260
|
|
254
261
|
it 'warns when cloud sdk credentials are used' do
|
255
262
|
mocked_signet = double('Signet::OAuth2::Client')
|
263
|
+
allow(mocked_signet).to receive(:configure_connection).and_return(mocked_signet)
|
256
264
|
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
257
265
|
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
258
266
|
mocked_signet
|
@@ -100,6 +100,19 @@ describe '#get_application_default' do
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
+
it "propagates default_connection option" do
|
104
|
+
Dir.mktmpdir do |dir|
|
105
|
+
key_path = File.join(dir, 'my_cert_file')
|
106
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
107
|
+
File.write(key_path, cred_json_text)
|
108
|
+
ENV[@var_name] = key_path
|
109
|
+
connection = Faraday.new(headers: {"User-Agent" => "hello"})
|
110
|
+
opts = options.merge(default_connection: connection)
|
111
|
+
creds = Google::Auth.get_application_default(@scope, opts)
|
112
|
+
expect(creds.build_default_connection).to be connection
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
103
116
|
it 'succeeds with default file without GOOGLE_APPLICATION_CREDENTIALS' do
|
104
117
|
ENV.delete(@var_name) unless ENV[@var_name].nil?
|
105
118
|
Dir.mktmpdir do |dir|
|
@@ -229,6 +229,14 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
229
229
|
ENV[CLIENT_EMAIL_VAR] = cred_json[:client_email]
|
230
230
|
expect(@clz.from_env(@scope)).to_not be_nil
|
231
231
|
end
|
232
|
+
|
233
|
+
it "propagates default_connection option" do
|
234
|
+
ENV[PRIVATE_KEY_VAR] = cred_json[:private_key]
|
235
|
+
ENV[CLIENT_EMAIL_VAR] = cred_json[:client_email]
|
236
|
+
connection = Faraday.new(headers: {"User-Agent" => "hello"})
|
237
|
+
creds = @clz.from_env(@scope, default_connection: connection)
|
238
|
+
expect(creds.build_default_connection).to be connection
|
239
|
+
end
|
232
240
|
end
|
233
241
|
|
234
242
|
describe '#from_well_known_path' do
|
@@ -274,6 +282,20 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
274
282
|
expect(credentials.project_id).to eq(cred_json[:project_id])
|
275
283
|
end
|
276
284
|
end
|
285
|
+
|
286
|
+
it "propagates default_connection option" do
|
287
|
+
Dir.mktmpdir do |dir|
|
288
|
+
key_path = File.join(dir, '.config', @known_path)
|
289
|
+
key_path = File.join(dir, WELL_KNOWN_PATH) if OS.windows?
|
290
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
291
|
+
File.write(key_path, cred_json_text)
|
292
|
+
ENV['HOME'] = dir
|
293
|
+
ENV['APPDATA'] = dir
|
294
|
+
connection = Faraday.new(headers: {"User-Agent" => "hello"})
|
295
|
+
creds = @clz.from_well_known_path(@scope, default_connection: connection)
|
296
|
+
expect(creds.build_default_connection).to be connection
|
297
|
+
end
|
298
|
+
end
|
277
299
|
end
|
278
300
|
|
279
301
|
describe '#from_system_default_path' do
|
@@ -305,6 +327,18 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
305
327
|
File.delete(@path)
|
306
328
|
end
|
307
329
|
end
|
330
|
+
|
331
|
+
it "propagates default_connection option" do
|
332
|
+
FakeFS do
|
333
|
+
ENV['ProgramData'] = '/etc'
|
334
|
+
FileUtils.mkdir_p(File.dirname(@path))
|
335
|
+
File.write(@path, cred_json_text)
|
336
|
+
connection = Faraday.new(headers: {"User-Agent" => "hello"})
|
337
|
+
creds = @clz.from_system_default_path(@scope, default_connection: connection)
|
338
|
+
expect(creds.build_default_connection).to be connection
|
339
|
+
File.delete(@path)
|
340
|
+
end
|
341
|
+
end
|
308
342
|
end
|
309
343
|
end
|
310
344
|
|
@@ -60,14 +60,45 @@ describe Signet::OAuth2::Client do
|
|
60
60
|
@key.public_key, true,
|
61
61
|
algorithm: 'RS256')
|
62
62
|
end
|
63
|
+
with_params = {body: hash_including(
|
64
|
+
"grant_type" => "urn:ietf:params:oauth:grant-type:jwt-bearer")}
|
65
|
+
if opts[:user_agent]
|
66
|
+
with_params[:headers] = {"User-Agent" => opts[:user_agent]}
|
67
|
+
end
|
63
68
|
stub_request(:post, 'https://oauth2.googleapis.com/token')
|
64
|
-
.with(
|
65
|
-
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer'
|
66
|
-
), &blk)
|
69
|
+
.with(with_params, &blk)
|
67
70
|
.to_return(body: body,
|
68
71
|
status: 200,
|
69
72
|
headers: { 'Content-Type' => 'application/json' })
|
70
73
|
end
|
71
74
|
|
72
75
|
it_behaves_like 'apply/apply! are OK'
|
76
|
+
|
77
|
+
describe "#configure_connection" do
|
78
|
+
it "honors default_connection" do
|
79
|
+
token = "1/abcdef1234567890"
|
80
|
+
stub = make_auth_stubs access_token: token, user_agent: "RubyRocks/1.0"
|
81
|
+
conn = Faraday.new headers: {"User-Agent" => "RubyRocks/1.0"}
|
82
|
+
@client.configure_connection(default_connection: conn)
|
83
|
+
md = { foo: "bar" }
|
84
|
+
@client.apply!(md)
|
85
|
+
want = { foo: "bar", authorization: "Bearer #{token}" }
|
86
|
+
expect(md).to eq(want)
|
87
|
+
expect(stub).to have_been_requested
|
88
|
+
end
|
89
|
+
|
90
|
+
it "honors connection_builder" do
|
91
|
+
token = "1/abcdef1234567890"
|
92
|
+
stub = make_auth_stubs access_token: token, user_agent: "RubyRocks/2.0"
|
93
|
+
connection_builder = proc do
|
94
|
+
Faraday.new headers: {"User-Agent" => "RubyRocks/2.0"}
|
95
|
+
end
|
96
|
+
@client.configure_connection(connection_builder: connection_builder)
|
97
|
+
md = { foo: "bar" }
|
98
|
+
@client.apply!(md)
|
99
|
+
want = { foo: "bar", authorization: "Bearer #{token}" }
|
100
|
+
expect(md).to eq(want)
|
101
|
+
expect(stub).to have_been_requested
|
102
|
+
end
|
103
|
+
end
|
73
104
|
end
|
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.
|
4
|
+
version: 0.8.0
|
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: 2019-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -115,6 +115,10 @@ executables: []
|
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
+
- ".github/CONTRIBUTING.md"
|
119
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
120
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
121
|
+
- ".github/ISSUE_TEMPLATE/support_request.md"
|
118
122
|
- ".gitignore"
|
119
123
|
- ".kokoro/build.bat"
|
120
124
|
- ".kokoro/build.sh"
|
@@ -135,7 +139,6 @@ files:
|
|
135
139
|
- ".travis.yml"
|
136
140
|
- CHANGELOG.md
|
137
141
|
- CODE_OF_CONDUCT.md
|
138
|
-
- CONTRIBUTING.md
|
139
142
|
- COPYING
|
140
143
|
- Gemfile
|
141
144
|
- README.md
|