googleauth 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +15 -0
- data/.travis.yml +1 -1
- data/README.md +2 -2
- data/googleauth.gemspec +3 -3
- data/lib/googleauth.rb +31 -3
- data/lib/googleauth/credentials_loader.rb +93 -0
- data/lib/googleauth/service_account.rb +11 -57
- data/lib/googleauth/user_refresh.rb +76 -0
- data/lib/googleauth/version.rb +1 -1
- data/spec/googleauth/compute_engine_spec.rb +2 -1
- data/spec/googleauth/get_application_default_spec.rb +132 -66
- data/spec/googleauth/service_account_spec.rb +11 -8
- data/spec/googleauth/signet_spec.rb +2 -1
- data/spec/googleauth/user_refresh_spec.rb +170 -0
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac8bcce8f139bb5d243108c0ab7273b52db59305
|
4
|
+
data.tar.gz: df908e203c1963f8194cd89d26d055cced4b5895
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7345453339664b2afd90a55695dfd02f075850c93ba6896193c9dccc7f8043da9762edfcf5131f9fe489dd0f6e1108cc2318f5bc2fc6e5363dd9c54cddba7b81
|
7
|
+
data.tar.gz: 0c556b84edd90bbfcd70132775acfb46c03f6bbcbb081d066d5e400e8e5f4ff60a01e059e5ad08b027eb3c58664449f5fc6bcd9450af417133c694eede138440
|
data/.rubocop.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2015-02-25 04:34:33 -0800 using RuboCop version 0.28.0.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 1
|
9
|
+
Metrics/AbcSize:
|
10
|
+
Max: 16
|
11
|
+
|
12
|
+
# Offense count: 1
|
13
|
+
# Configuration parameters: CountComments.
|
14
|
+
Metrics/MethodLength:
|
15
|
+
Max: 11
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -36,8 +36,8 @@ $ gem install googleauth
|
|
36
36
|
require 'googleauth'
|
37
37
|
|
38
38
|
# Get the environment configured authorization
|
39
|
-
|
40
|
-
authorization = Google::Auth.get_application_default(
|
39
|
+
scopes = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/compute']
|
40
|
+
authorization = Google::Auth.get_application_default(scopes)
|
41
41
|
|
42
42
|
# Add the the access token obtained using the authorization to a hash, e.g
|
43
43
|
# headers.
|
data/googleauth.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.email = 'temiola@google.com'
|
11
11
|
s.homepage = 'https://github.com/google/google-auth-library-ruby'
|
12
12
|
s.summary = 'Google Auth Library for Ruby'
|
13
|
-
s.license =
|
13
|
+
s.license = 'Apache-2.0'
|
14
14
|
s.description = <<-eos
|
15
15
|
Allows simple authorization for accessing Google APIs.
|
16
16
|
Provide support for Application Default Credentials, as described at
|
@@ -27,9 +27,9 @@ Gem::Specification.new do |s|
|
|
27
27
|
|
28
28
|
s.add_dependency 'faraday', '~> 0.9'
|
29
29
|
s.add_dependency 'logging', '~> 1.8'
|
30
|
-
s.add_dependency 'jwt', '~> 1.
|
30
|
+
s.add_dependency 'jwt', '~> 1.3.0'
|
31
31
|
s.add_dependency 'memoist', '~> 0.11.0'
|
32
|
-
s.add_dependency 'multi_json', '1.
|
32
|
+
s.add_dependency 'multi_json', '1.11.0'
|
33
33
|
s.add_dependency 'signet', '~> 0.6.0'
|
34
34
|
|
35
35
|
s.add_development_dependency 'bundler', '~> 1.7'
|
data/lib/googleauth.rb
CHANGED
@@ -27,8 +27,13 @@
|
|
27
27
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
|
-
require '
|
30
|
+
require 'multi_json'
|
31
|
+
require 'stringio'
|
32
|
+
|
33
|
+
require 'googleauth/credentials_loader'
|
31
34
|
require 'googleauth/compute_engine'
|
35
|
+
require 'googleauth/service_account'
|
36
|
+
require 'googleauth/user_refresh'
|
32
37
|
|
33
38
|
module Google
|
34
39
|
# Module Auth provides classes that provide Google-specific authorization
|
@@ -40,6 +45,29 @@ https://developers.google.com/accounts/docs/application-default-credentials
|
|
40
45
|
for more information
|
41
46
|
END
|
42
47
|
|
48
|
+
# DefaultCredentials is used to preload the credentials file, to determine
|
49
|
+
# which type of credentials should be loaded.
|
50
|
+
class DefaultCredentials
|
51
|
+
extend CredentialsLoader
|
52
|
+
|
53
|
+
# override CredentialsLoader#make_creds to use the class determined by
|
54
|
+
# loading the json.
|
55
|
+
def self.make_creds(scope, json_key_io)
|
56
|
+
json_key, clz = determine_creds_class(json_key_io)
|
57
|
+
clz.new(scope, StringIO.new(MultiJson.dump(json_key)))
|
58
|
+
end
|
59
|
+
|
60
|
+
# Reads the input json and determines which creds class to use.
|
61
|
+
def self.determine_creds_class(json_key_io)
|
62
|
+
json_key = MultiJson.load(json_key_io.read)
|
63
|
+
fail "the json is missing the #{key} field" unless json_key.key?('type')
|
64
|
+
type = json_key['type']
|
65
|
+
return json_key, ServiceAccountCredentials if type == 'service_account'
|
66
|
+
return [json_key, UserRefreshCredentials] if type == 'authorized_user'
|
67
|
+
fail "credentials type '#{type}' is not supported"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
43
71
|
# Obtains the default credentials implementation to use in this
|
44
72
|
# environment.
|
45
73
|
#
|
@@ -53,9 +81,9 @@ END
|
|
53
81
|
# @param scope [string|array] the scope(s) to access
|
54
82
|
# @param options [hash] allows override of the connection being used
|
55
83
|
def get_application_default(scope, options = {})
|
56
|
-
creds =
|
84
|
+
creds = DefaultCredentials.from_env(scope)
|
57
85
|
return creds unless creds.nil?
|
58
|
-
creds =
|
86
|
+
creds = DefaultCredentials.from_well_known_path(scope)
|
59
87
|
return creds unless creds.nil?
|
60
88
|
fail NOT_FOUND_ERROR unless GCECredentials.on_gce?(options)
|
61
89
|
GCECredentials.new
|
@@ -0,0 +1,93 @@
|
|
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
|
+
require 'memoist'
|
31
|
+
require 'rbconfig'
|
32
|
+
|
33
|
+
module Google
|
34
|
+
# Module Auth provides classes that provide Google-specific authorization
|
35
|
+
# used to access Google APIs.
|
36
|
+
module Auth
|
37
|
+
# CredentialsLoader contains the behaviour used to locate and find default
|
38
|
+
# credentials files on the file system.
|
39
|
+
module CredentialsLoader
|
40
|
+
extend Memoist
|
41
|
+
ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS'
|
42
|
+
NOT_FOUND_ERROR =
|
43
|
+
"Unable to read the credential file specified by #{ENV_VAR}"
|
44
|
+
WELL_KNOWN_PATH = 'gcloud/application_default_credentials.json'
|
45
|
+
WELL_KNOWN_ERROR = 'Unable to read the default credential file'
|
46
|
+
|
47
|
+
# determines if the current OS is windows
|
48
|
+
def windows?
|
49
|
+
RbConfig::CONFIG['host_os'] =~ /Windows|mswin/
|
50
|
+
end
|
51
|
+
memoize :windows?
|
52
|
+
|
53
|
+
# make_creds proxies the construction of a credentials instance
|
54
|
+
#
|
55
|
+
# By default, it calls #new on the current class, but this behaviour can
|
56
|
+
# be modified, allowing different instances to be created.
|
57
|
+
def make_creds(*args)
|
58
|
+
new(*args)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Creates an instance from the path specified in an environment
|
62
|
+
# variable.
|
63
|
+
#
|
64
|
+
# @param scope [string|array] the scope(s) to access
|
65
|
+
def from_env(scope)
|
66
|
+
return nil unless ENV.key?(ENV_VAR)
|
67
|
+
path = ENV[ENV_VAR]
|
68
|
+
fail 'file #{path} does not exist' unless File.exist?(path)
|
69
|
+
File.open(path) do |f|
|
70
|
+
return make_creds(scope, f)
|
71
|
+
end
|
72
|
+
rescue StandardError => e
|
73
|
+
raise "#{NOT_FOUND_ERROR}: #{e}"
|
74
|
+
end
|
75
|
+
|
76
|
+
# Creates an instance from a well known path.
|
77
|
+
#
|
78
|
+
# @param scope [string|array] the scope(s) to access
|
79
|
+
def from_well_known_path(scope)
|
80
|
+
home_var, base = windows? ? 'APPDATA' : 'HOME', WELL_KNOWN_PATH
|
81
|
+
root = ENV[home_var].nil? ? '' : ENV[home_var]
|
82
|
+
base = File.join('.config', base) unless windows?
|
83
|
+
path = File.join(root, base)
|
84
|
+
return nil unless File.exist?(path)
|
85
|
+
File.open(path) do |f|
|
86
|
+
return make_creds(scope, f)
|
87
|
+
end
|
88
|
+
rescue StandardError => e
|
89
|
+
raise "#{WELL_KNOWN_ERROR}: #{e}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -28,18 +28,8 @@
|
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
require 'googleauth/signet'
|
31
|
-
require '
|
31
|
+
require 'googleauth/credentials_loader'
|
32
32
|
require 'multi_json'
|
33
|
-
require 'openssl'
|
34
|
-
require 'rbconfig'
|
35
|
-
|
36
|
-
# Reads the private key and client email fields from service account JSON key.
|
37
|
-
def read_json_key(json_key_io)
|
38
|
-
json_key = MultiJson.load(json_key_io.read)
|
39
|
-
fail 'missing client_email' unless json_key.key?('client_email')
|
40
|
-
fail 'missing private_key' unless json_key.key?('private_key')
|
41
|
-
[json_key['private_key'], json_key['client_email']]
|
42
|
-
end
|
43
33
|
|
44
34
|
module Google
|
45
35
|
# Module Auth provides classes that provide Google-specific authorization
|
@@ -53,52 +43,16 @@ module Google
|
|
53
43
|
#
|
54
44
|
# cf [Application Default Credentials](http://goo.gl/mkAHpZ)
|
55
45
|
class ServiceAccountCredentials < Signet::OAuth2::Client
|
56
|
-
ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS'
|
57
|
-
NOT_FOUND_ERROR =
|
58
|
-
"Unable to read the credential file specified by #{ENV_VAR}"
|
59
46
|
TOKEN_CRED_URI = 'https://www.googleapis.com/oauth2/v3/token'
|
60
|
-
|
61
|
-
WELL_KNOWN_ERROR = 'Unable to read the default credential file'
|
62
|
-
|
63
|
-
class << self
|
64
|
-
extend Memoist
|
65
|
-
|
66
|
-
# determines if the current OS is windows
|
67
|
-
def windows?
|
68
|
-
RbConfig::CONFIG['host_os'] =~ /Windows|mswin/
|
69
|
-
end
|
70
|
-
memoize :windows?
|
71
|
-
|
72
|
-
# Creates an instance from the path specified in an environment
|
73
|
-
# variable.
|
74
|
-
#
|
75
|
-
# @param scope [string|array] the scope(s) to access
|
76
|
-
def from_env(scope)
|
77
|
-
return nil unless ENV.key?(ENV_VAR)
|
78
|
-
path = ENV[ENV_VAR]
|
79
|
-
fail 'file #{path} does not exist' unless File.exist?(path)
|
80
|
-
File.open(path) do |f|
|
81
|
-
return new(scope, f)
|
82
|
-
end
|
83
|
-
rescue StandardError => e
|
84
|
-
raise "#{NOT_FOUND_ERROR}: #{e}"
|
85
|
-
end
|
47
|
+
extend CredentialsLoader
|
86
48
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
path = File.join(root, base)
|
95
|
-
return nil unless File.exist?(path)
|
96
|
-
File.open(path) do |f|
|
97
|
-
return new(scope, f)
|
98
|
-
end
|
99
|
-
rescue StandardError => e
|
100
|
-
raise "#{WELL_KNOWN_ERROR}: #{e}"
|
101
|
-
end
|
49
|
+
# Reads the private key and client email fields from the service account
|
50
|
+
# JSON key.
|
51
|
+
def self.read_json_key(json_key_io)
|
52
|
+
json_key = MultiJson.load(json_key_io.read)
|
53
|
+
fail 'missing client_email' unless json_key.key?('client_email')
|
54
|
+
fail 'missing private_key' unless json_key.key?('private_key')
|
55
|
+
[json_key['private_key'], json_key['client_email']]
|
102
56
|
end
|
103
57
|
|
104
58
|
# Initializes a ServiceAccountCredentials.
|
@@ -106,9 +60,9 @@ module Google
|
|
106
60
|
# @param scope [string|array] the scope(s) to access
|
107
61
|
# @param json_key_io [IO] an IO from which the JSON key can be read
|
108
62
|
def initialize(scope, json_key_io)
|
109
|
-
private_key, client_email = read_json_key(json_key_io)
|
63
|
+
private_key, client_email = self.class.read_json_key(json_key_io)
|
110
64
|
super(token_credential_uri: TOKEN_CRED_URI,
|
111
|
-
audience: TOKEN_CRED_URI,
|
65
|
+
audience: TOKEN_CRED_URI,
|
112
66
|
scope: scope,
|
113
67
|
issuer: client_email,
|
114
68
|
signing_key: OpenSSL::PKey::RSA.new(private_key))
|
@@ -0,0 +1,76 @@
|
|
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
|
+
require 'googleauth/signet'
|
31
|
+
require 'googleauth/credentials_loader'
|
32
|
+
require 'multi_json'
|
33
|
+
|
34
|
+
module Google
|
35
|
+
# Module Auth provides classes that provide Google-specific authorization
|
36
|
+
# used to access Google APIs.
|
37
|
+
module Auth
|
38
|
+
# Authenticates requests using User Refresh credentials.
|
39
|
+
#
|
40
|
+
# This class allows authorizing requests from user refresh tokens.
|
41
|
+
#
|
42
|
+
# This the end of the result of a 3LO flow. E.g, the end result of
|
43
|
+
# 'gcloud auth login' saves a file with these contents in well known
|
44
|
+
# location
|
45
|
+
#
|
46
|
+
# cf [Application Default Credentials](http://goo.gl/mkAHpZ)
|
47
|
+
class UserRefreshCredentials < Signet::OAuth2::Client
|
48
|
+
TOKEN_CRED_URI = 'https://www.googleapis.com/oauth2/v3/token'
|
49
|
+
extend CredentialsLoader
|
50
|
+
|
51
|
+
# Reads the client_id, client_secret and refresh_token fields from the
|
52
|
+
# JSON key.
|
53
|
+
def self.read_json_key(json_key_io)
|
54
|
+
json_key = MultiJson.load(json_key_io.read)
|
55
|
+
wanted = %w(client_id client_secret refresh_token)
|
56
|
+
wanted.each do |key|
|
57
|
+
fail "the json is missing the #{key} field" unless json_key.key?(key)
|
58
|
+
end
|
59
|
+
json_key
|
60
|
+
end
|
61
|
+
|
62
|
+
# Initializes a UserRefreshCredentials.
|
63
|
+
#
|
64
|
+
# @param scope [string|array] the scope(s) to access
|
65
|
+
# @param json_key_io [IO] an IO from which the JSON key can be read
|
66
|
+
def initialize(scope, json_key_io)
|
67
|
+
user_creds = self.class.read_json_key(json_key_io)
|
68
|
+
super(token_credential_uri: TOKEN_CRED_URI,
|
69
|
+
client_id: user_creds['client_id'],
|
70
|
+
client_secret: user_creds['client_secret'],
|
71
|
+
refresh_token: user_creds['refresh_token'],
|
72
|
+
scope: scope)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/googleauth/version.rb
CHANGED
@@ -44,7 +44,8 @@ describe Google::Auth::GCECredentials do
|
|
44
44
|
@client = GCECredentials.new
|
45
45
|
end
|
46
46
|
|
47
|
-
def make_auth_stubs(
|
47
|
+
def make_auth_stubs(opts = {})
|
48
|
+
access_token = opts[:access_token] || ''
|
48
49
|
Faraday::Adapter::Test::Stubs.new do |stub|
|
49
50
|
stub.get(MD_URI) do |env|
|
50
51
|
headers = env[:request_headers]
|
@@ -38,7 +38,7 @@ require 'spec_helper'
|
|
38
38
|
describe '#get_application_default' do
|
39
39
|
before(:example) do
|
40
40
|
@key = OpenSSL::PKey::RSA.new(2048)
|
41
|
-
@var_name =
|
41
|
+
@var_name = CredentialsLoader::ENV_VAR
|
42
42
|
@orig = ENV[@var_name]
|
43
43
|
@home = ENV['HOME']
|
44
44
|
@scope = 'https://www.googleapis.com/auth/userinfo.profile'
|
@@ -49,86 +49,152 @@ describe '#get_application_default' do
|
|
49
49
|
ENV['HOME'] = @home unless @home == ENV['HOME']
|
50
50
|
end
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
MultiJson.dump(cred_json)
|
61
|
-
end
|
52
|
+
shared_examples 'it cannot load misconfigured credentials' do
|
53
|
+
it 'fails if the GOOGLE_APPLICATION_CREDENTIALS path does not exist' do
|
54
|
+
Dir.mktmpdir do |dir|
|
55
|
+
key_path = File.join(dir, 'does-not-exist')
|
56
|
+
ENV[@var_name] = key_path
|
57
|
+
expect { Google::Auth.get_application_default(@scope) }.to raise_error
|
58
|
+
end
|
59
|
+
end
|
62
60
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
61
|
+
it 'fails without default file or env if not on compute engine' do
|
62
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
63
|
+
stub.get('/') do |_env|
|
64
|
+
[404,
|
65
|
+
{ 'Metadata-Flavor' => 'Google' },
|
66
|
+
'']
|
67
|
+
end
|
68
|
+
end # GCE not detected
|
69
|
+
Dir.mktmpdir do |dir|
|
70
|
+
ENV.delete(@var_name) unless ENV[@var_name].nil? # no env var
|
71
|
+
ENV['HOME'] = dir # no config present in this tmp dir
|
72
|
+
c = Faraday.new do |b|
|
73
|
+
b.adapter(:test, stubs)
|
74
|
+
end
|
75
|
+
blk = proc do
|
76
|
+
Google::Auth.get_application_default(@scope, connection: c)
|
77
|
+
end
|
78
|
+
expect(&blk).to raise_error
|
79
|
+
end
|
80
|
+
stubs.verify_stubbed_calls
|
68
81
|
end
|
69
82
|
end
|
70
83
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
84
|
+
shared_examples 'it can successfully load credentials' do
|
85
|
+
it 'succeeds if the GOOGLE_APPLICATION_CREDENTIALS file is valid' do
|
86
|
+
Dir.mktmpdir do |dir|
|
87
|
+
key_path = File.join(dir, 'my_cert_file')
|
88
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
89
|
+
File.write(key_path, cred_json_text)
|
90
|
+
ENV[@var_name] = key_path
|
91
|
+
expect(Google::Auth.get_application_default(@scope)).to_not be_nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'succeeds with default file without GOOGLE_APPLICATION_CREDENTIALS' do
|
96
|
+
ENV.delete(@var_name) unless ENV[@var_name].nil?
|
97
|
+
Dir.mktmpdir do |dir|
|
98
|
+
key_path = File.join(dir, '.config',
|
99
|
+
CredentialsLoader::WELL_KNOWN_PATH)
|
100
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
101
|
+
File.write(key_path, cred_json_text)
|
102
|
+
ENV['HOME'] = dir
|
103
|
+
expect(Google::Auth.get_application_default(@scope)).to_not be_nil
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'succeeds without default file or env if on compute engine' do
|
108
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
109
|
+
stub.get('/') do |_env|
|
110
|
+
[200,
|
111
|
+
{ 'Metadata-Flavor' => 'Google' },
|
112
|
+
'']
|
113
|
+
end
|
114
|
+
end # GCE detected
|
115
|
+
Dir.mktmpdir do |dir|
|
116
|
+
ENV.delete(@var_name) unless ENV[@var_name].nil? # no env var
|
117
|
+
ENV['HOME'] = dir # no config present in this tmp dir
|
118
|
+
c = Faraday.new do |b|
|
119
|
+
b.adapter(:test, stubs)
|
120
|
+
end
|
121
|
+
creds = Google::Auth.get_application_default(
|
122
|
+
@scope,
|
123
|
+
connection: c)
|
124
|
+
expect(creds).to_not be_nil
|
125
|
+
end
|
126
|
+
stubs.verify_stubbed_calls
|
78
127
|
end
|
79
128
|
end
|
80
129
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
130
|
+
describe 'when credential type is service account' do
|
131
|
+
def cred_json_text
|
132
|
+
cred_json = {
|
133
|
+
private_key_id: 'a_private_key_id',
|
134
|
+
private_key: @key.to_pem,
|
135
|
+
client_email: 'app@developer.gserviceaccount.com',
|
136
|
+
client_id: 'app.apps.googleusercontent.com',
|
137
|
+
type: 'service_account'
|
138
|
+
}
|
139
|
+
MultiJson.dump(cred_json)
|
90
140
|
end
|
141
|
+
|
142
|
+
it_behaves_like 'it can successfully load credentials'
|
143
|
+
it_behaves_like 'it cannot load misconfigured credentials'
|
91
144
|
end
|
92
145
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
ENV.delete(@var_name) unless ENV[@var_name].nil? # no env var
|
103
|
-
ENV['HOME'] = dir # no config present in this tmp dir
|
104
|
-
c = Faraday.new do |b|
|
105
|
-
b.adapter(:test, stubs)
|
106
|
-
end
|
107
|
-
blk = proc do
|
108
|
-
Google::Auth.get_application_default(@scope, connection: c)
|
109
|
-
end
|
110
|
-
expect(&blk).to raise_error
|
146
|
+
describe 'when credential type is authorized_user' do
|
147
|
+
def cred_json_text
|
148
|
+
cred_json = {
|
149
|
+
client_secret: 'privatekey',
|
150
|
+
refresh_token: 'refreshtoken',
|
151
|
+
client_id: 'app.apps.googleusercontent.com',
|
152
|
+
type: 'authorized_user'
|
153
|
+
}
|
154
|
+
MultiJson.dump(cred_json)
|
111
155
|
end
|
112
|
-
|
156
|
+
|
157
|
+
it_behaves_like 'it can successfully load credentials'
|
158
|
+
it_behaves_like 'it cannot load misconfigured credentials'
|
113
159
|
end
|
114
160
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
161
|
+
describe 'when credential type is unknown' do
|
162
|
+
def cred_json_text
|
163
|
+
cred_json = {
|
164
|
+
client_secret: 'privatekey',
|
165
|
+
refresh_token: 'refreshtoken',
|
166
|
+
client_id: 'app.apps.googleusercontent.com',
|
167
|
+
type: 'not_known_type'
|
168
|
+
}
|
169
|
+
MultiJson.dump(cred_json)
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'fails if the GOOGLE_APPLICATION_CREDENTIALS file contains the creds' do
|
173
|
+
Dir.mktmpdir do |dir|
|
174
|
+
key_path = File.join(dir, 'my_cert_file')
|
175
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
176
|
+
File.write(key_path, cred_json_text)
|
177
|
+
ENV[@var_name] = key_path
|
178
|
+
blk = proc do
|
179
|
+
Google::Auth.get_application_default(@scope)
|
180
|
+
end
|
181
|
+
expect(&blk).to raise_error RuntimeError
|
121
182
|
end
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
ENV[
|
126
|
-
|
127
|
-
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'fails if the well known file contains the creds' do
|
186
|
+
ENV.delete(@var_name) unless ENV[@var_name].nil?
|
187
|
+
Dir.mktmpdir do |dir|
|
188
|
+
key_path = File.join(dir, '.config',
|
189
|
+
CredentialsLoader::WELL_KNOWN_PATH)
|
190
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
191
|
+
File.write(key_path, cred_json_text)
|
192
|
+
ENV['HOME'] = dir
|
193
|
+
blk = proc do
|
194
|
+
Google::Auth.get_application_default(@scope)
|
195
|
+
end
|
196
|
+
expect(&blk).to raise_error RuntimeError
|
128
197
|
end
|
129
|
-
expect(Google::Auth.get_application_default(@scope,
|
130
|
-
connection: c)).to_not be_nil
|
131
198
|
end
|
132
|
-
stubs.verify_stubbed_calls
|
133
199
|
end
|
134
200
|
end
|
@@ -42,6 +42,7 @@ require 'tmpdir'
|
|
42
42
|
|
43
43
|
describe Google::Auth::ServiceAccountCredentials do
|
44
44
|
ServiceAccountCredentials = Google::Auth::ServiceAccountCredentials
|
45
|
+
CredentialsLoader = Google::Auth::CredentialsLoader
|
45
46
|
|
46
47
|
before(:example) do
|
47
48
|
@key = OpenSSL::PKey::RSA.new(2048)
|
@@ -50,7 +51,8 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
50
51
|
StringIO.new(cred_json_text))
|
51
52
|
end
|
52
53
|
|
53
|
-
def make_auth_stubs(
|
54
|
+
def make_auth_stubs(opts = {})
|
55
|
+
access_token = opts[:access_token] || ''
|
54
56
|
Faraday::Adapter::Test::Stubs.new do |stub|
|
55
57
|
stub.post('/oauth2/v3/token') do |env|
|
56
58
|
params = Addressable::URI.form_unencode(env[:body])
|
@@ -78,9 +80,10 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
78
80
|
|
79
81
|
describe '#from_env' do
|
80
82
|
before(:example) do
|
81
|
-
@var_name =
|
83
|
+
@var_name = CredentialsLoader::ENV_VAR
|
82
84
|
@orig = ENV[@var_name]
|
83
85
|
@scope = 'https://www.googleapis.com/auth/userinfo.profile'
|
86
|
+
@clz = ServiceAccountCredentials
|
84
87
|
end
|
85
88
|
|
86
89
|
after(:example) do
|
@@ -98,18 +101,17 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
98
101
|
Dir.mktmpdir do |dir|
|
99
102
|
key_path = File.join(dir, 'does-not-exist')
|
100
103
|
ENV[@var_name] = key_path
|
101
|
-
expect {
|
104
|
+
expect { @clz.from_env(@scope) }.to raise_error
|
102
105
|
end
|
103
106
|
end
|
104
107
|
|
105
108
|
it 'succeeds when the GOOGLE_APPLICATION_CREDENTIALS file is valid' do
|
106
|
-
sac = ServiceAccountCredentials # shortens name
|
107
109
|
Dir.mktmpdir do |dir|
|
108
110
|
key_path = File.join(dir, 'my_cert_file')
|
109
111
|
FileUtils.mkdir_p(File.dirname(key_path))
|
110
112
|
File.write(key_path, cred_json_text)
|
111
113
|
ENV[@var_name] = key_path
|
112
|
-
expect(
|
114
|
+
expect(@clz.from_env(@scope)).to_not be_nil
|
113
115
|
end
|
114
116
|
end
|
115
117
|
end
|
@@ -118,6 +120,8 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
118
120
|
before(:example) do
|
119
121
|
@home = ENV['HOME']
|
120
122
|
@scope = 'https://www.googleapis.com/auth/userinfo.profile'
|
123
|
+
@known_path = CredentialsLoader::WELL_KNOWN_PATH
|
124
|
+
@clz = ServiceAccountCredentials
|
121
125
|
end
|
122
126
|
|
123
127
|
after(:example) do
|
@@ -130,13 +134,12 @@ describe Google::Auth::ServiceAccountCredentials do
|
|
130
134
|
end
|
131
135
|
|
132
136
|
it 'successfully loads the file when it is present' do
|
133
|
-
sac = ServiceAccountCredentials # shortens name
|
134
137
|
Dir.mktmpdir do |dir|
|
135
|
-
key_path = File.join(dir, '.config',
|
138
|
+
key_path = File.join(dir, '.config', @known_path)
|
136
139
|
FileUtils.mkdir_p(File.dirname(key_path))
|
137
140
|
File.write(key_path, cred_json_text)
|
138
141
|
ENV['HOME'] = dir
|
139
|
-
expect(
|
142
|
+
expect(@clz.from_well_known_path(@scope)).to_not be_nil
|
140
143
|
end
|
141
144
|
end
|
142
145
|
end
|
@@ -49,7 +49,8 @@ describe Signet::OAuth2::Client do
|
|
49
49
|
)
|
50
50
|
end
|
51
51
|
|
52
|
-
def make_auth_stubs(
|
52
|
+
def make_auth_stubs(opts)
|
53
|
+
access_token = opts[:access_token] || ''
|
53
54
|
Faraday::Adapter::Test::Stubs.new do |stub|
|
54
55
|
stub.post('/o/oauth2/token') do |env|
|
55
56
|
params = Addressable::URI.form_unencode(env[:body])
|
@@ -0,0 +1,170 @@
|
|
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
|
+
spec_dir = File.expand_path(File.join(File.dirname(__FILE__)))
|
31
|
+
$LOAD_PATH.unshift(spec_dir)
|
32
|
+
$LOAD_PATH.uniq!
|
33
|
+
|
34
|
+
require 'apply_auth_examples'
|
35
|
+
require 'fileutils'
|
36
|
+
require 'googleauth/user_refresh'
|
37
|
+
require 'jwt'
|
38
|
+
require 'multi_json'
|
39
|
+
require 'openssl'
|
40
|
+
require 'spec_helper'
|
41
|
+
require 'tmpdir'
|
42
|
+
|
43
|
+
describe Google::Auth::UserRefreshCredentials do
|
44
|
+
UserRefreshCredentials = Google::Auth::UserRefreshCredentials
|
45
|
+
CredentialsLoader = Google::Auth::CredentialsLoader
|
46
|
+
|
47
|
+
before(:example) do
|
48
|
+
@key = OpenSSL::PKey::RSA.new(2048)
|
49
|
+
@client = UserRefreshCredentials.new(
|
50
|
+
'https://www.googleapis.com/auth/userinfo.profile',
|
51
|
+
StringIO.new(cred_json_text))
|
52
|
+
end
|
53
|
+
|
54
|
+
def make_auth_stubs(opts = {})
|
55
|
+
access_token = opts[:access_token] || ''
|
56
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
57
|
+
stub.post('/oauth2/v3/token') do |env|
|
58
|
+
params = Addressable::URI.form_unencode(env[:body])
|
59
|
+
want = %w(grant_type refresh_token)
|
60
|
+
expect(params.assoc('grant_type')).to eq(want)
|
61
|
+
build_access_token_json(access_token)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def cred_json_text(missing = nil)
|
67
|
+
cred_json = {
|
68
|
+
client_secret: 'privatekey',
|
69
|
+
client_id: 'client123',
|
70
|
+
refresh_token: 'refreshtoken',
|
71
|
+
type: 'authorized_user'
|
72
|
+
}
|
73
|
+
cred_json.delete(missing.to_sym) unless missing.nil?
|
74
|
+
MultiJson.dump(cred_json)
|
75
|
+
end
|
76
|
+
|
77
|
+
it_behaves_like 'apply/apply! are OK'
|
78
|
+
|
79
|
+
describe '#from_env' do
|
80
|
+
before(:example) do
|
81
|
+
@var_name = CredentialsLoader::ENV_VAR
|
82
|
+
@orig = ENV[@var_name]
|
83
|
+
@scope = 'https://www.googleapis.com/auth/userinfo.profile'
|
84
|
+
@clz = UserRefreshCredentials
|
85
|
+
end
|
86
|
+
|
87
|
+
after(:example) do
|
88
|
+
ENV[@var_name] = @orig unless @orig.nil?
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'returns nil if the GOOGLE_APPLICATION_CREDENTIALS is unset' do
|
92
|
+
ENV.delete(@var_name) unless ENV[@var_name].nil?
|
93
|
+
expect(UserRefreshCredentials.from_env(@scope)).to be_nil
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'fails if the GOOGLE_APPLICATION_CREDENTIALS path does not exist' do
|
97
|
+
ENV.delete(@var_name) unless ENV[@var_name].nil?
|
98
|
+
expect(UserRefreshCredentials.from_env(@scope)).to be_nil
|
99
|
+
Dir.mktmpdir do |dir|
|
100
|
+
key_path = File.join(dir, 'does-not-exist')
|
101
|
+
ENV[@var_name] = key_path
|
102
|
+
expect { @clz.from_env(@scope) }.to raise_error
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'fails if the GOOGLE_APPLICATION_CREDENTIALS path file is invalid' do
|
107
|
+
needed = %w(client_id client_secret refresh_token)
|
108
|
+
needed.each do |missing|
|
109
|
+
Dir.mktmpdir do |dir|
|
110
|
+
key_path = File.join(dir, 'my_cert_file')
|
111
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
112
|
+
File.write(key_path, cred_json_text(missing))
|
113
|
+
ENV[@var_name] = key_path
|
114
|
+
expect { @clz.from_env(@scope) }.to raise_error
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'succeeds when the GOOGLE_APPLICATION_CREDENTIALS file is valid' do
|
120
|
+
Dir.mktmpdir do |dir|
|
121
|
+
key_path = File.join(dir, 'my_cert_file')
|
122
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
123
|
+
File.write(key_path, cred_json_text)
|
124
|
+
ENV[@var_name] = key_path
|
125
|
+
expect(@clz.from_env(@scope)).to_not be_nil
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe '#from_well_known_path' do
|
131
|
+
before(:example) do
|
132
|
+
@home = ENV['HOME']
|
133
|
+
@scope = 'https://www.googleapis.com/auth/userinfo.profile'
|
134
|
+
@known_path = CredentialsLoader::WELL_KNOWN_PATH
|
135
|
+
@clz = UserRefreshCredentials
|
136
|
+
end
|
137
|
+
|
138
|
+
after(:example) do
|
139
|
+
ENV['HOME'] = @home unless @home == ENV['HOME']
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'is nil if no file exists' do
|
143
|
+
ENV['HOME'] = File.dirname(__FILE__)
|
144
|
+
expect(UserRefreshCredentials.from_well_known_path(@scope)).to be_nil
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'fails if the file is invalid' do
|
148
|
+
needed = %w(client_id client_secret refresh_token)
|
149
|
+
needed.each do |missing|
|
150
|
+
Dir.mktmpdir do |dir|
|
151
|
+
key_path = File.join(dir, '.config', @known_path)
|
152
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
153
|
+
File.write(key_path, cred_json_text(missing))
|
154
|
+
ENV['HOME'] = dir
|
155
|
+
expect { @clz.from_env(@scope) }.to raise_error
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'successfully loads the file when it is present' do
|
161
|
+
Dir.mktmpdir do |dir|
|
162
|
+
key_path = File.join(dir, '.config', @known_path)
|
163
|
+
FileUtils.mkdir_p(File.dirname(key_path))
|
164
|
+
File.write(key_path, cred_json_text)
|
165
|
+
ENV['HOME'] = dir
|
166
|
+
expect(@clz.from_well_known_path(@scope)).to_not be_nil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
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.2.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: 2015-
|
11
|
+
date: 2015-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
47
|
+
version: 1.3.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
54
|
+
version: 1.3.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: memoist
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
75
|
+
version: 1.11.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
82
|
+
version: 1.11.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: signet
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -161,6 +161,8 @@ extra_rdoc_files: []
|
|
161
161
|
files:
|
162
162
|
- ".gitignore"
|
163
163
|
- ".rspec"
|
164
|
+
- ".rubocop.yml"
|
165
|
+
- ".rubocop_todo.yml"
|
164
166
|
- ".travis.yml"
|
165
167
|
- CONTRIBUTING.md
|
166
168
|
- COPYING
|
@@ -170,14 +172,17 @@ files:
|
|
170
172
|
- googleauth.gemspec
|
171
173
|
- lib/googleauth.rb
|
172
174
|
- lib/googleauth/compute_engine.rb
|
175
|
+
- lib/googleauth/credentials_loader.rb
|
173
176
|
- lib/googleauth/service_account.rb
|
174
177
|
- lib/googleauth/signet.rb
|
178
|
+
- lib/googleauth/user_refresh.rb
|
175
179
|
- lib/googleauth/version.rb
|
176
180
|
- spec/googleauth/apply_auth_examples.rb
|
177
181
|
- spec/googleauth/compute_engine_spec.rb
|
178
182
|
- spec/googleauth/get_application_default_spec.rb
|
179
183
|
- spec/googleauth/service_account_spec.rb
|
180
184
|
- spec/googleauth/signet_spec.rb
|
185
|
+
- spec/googleauth/user_refresh_spec.rb
|
181
186
|
- spec/spec_helper.rb
|
182
187
|
homepage: https://github.com/google/google-auth-library-ruby
|
183
188
|
licenses:
|
@@ -209,4 +214,5 @@ test_files:
|
|
209
214
|
- spec/googleauth/get_application_default_spec.rb
|
210
215
|
- spec/googleauth/service_account_spec.rb
|
211
216
|
- spec/googleauth/signet_spec.rb
|
217
|
+
- spec/googleauth/user_refresh_spec.rb
|
212
218
|
- spec/spec_helper.rb
|