googleauth 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2b7b1cf21b1190e227d1c6da0e204a2eaf9a562
4
- data.tar.gz: e2bb3c3f74e40bea4ff997f3613f07815f8f78ab
3
+ metadata.gz: c7166e05e50e9d66f0fbbe0ed95674c008772078
4
+ data.tar.gz: ac765a872c1302acc55ff76acff1adb3c421402a
5
5
  SHA512:
6
- metadata.gz: f268b6486b2638195745c6750f256de0d4e703c9896bc6164b84c626eb6057ef6e6c159471d75215e3110cefe5c07c44180273d1ce6140fa1ffd8274272cb930
7
- data.tar.gz: 2cf2c5a305ecc069c01c7a0a3a848e45bceb449cf5a57c3a15906284a96dca9631b86c1e563cb6a5b1b3d25828ad7971e7a1e6315964b838bdbc0cfad8a5d499
6
+ metadata.gz: 2e379500990afa645e680fef25c180d6476042bbeeda083d02cd442d98a5cc3c1ce9f47bcab8ac4463841b51a5aa8603051da1e30884cd4dc207e5c75404acde
7
+ data.tar.gz: 22aa2ecb920bd44334d5dfbfc906b3a736a56943c5a8d90d43ad7762648542884ee9392e31acfb45ec44233fae34ca0f957d963f6cba554dba7e86df4b07c7da
@@ -1 +1,26 @@
1
- inherit_from: .rubocop_todo.yml
1
+ AllCops:
2
+ Exclude:
3
+ - "spec/**/*"
4
+
5
+ Metrics/AbcSize:
6
+ Max: 25
7
+ Metrics/BlockLength:
8
+ Exclude:
9
+ - "googleauth.gemspec"
10
+ Metrics/CyclomaticComplexity:
11
+ Max: 8
12
+ Metrics/MethodLength:
13
+ Max: 20
14
+ Metrics/ClassLength:
15
+ Enabled: false
16
+ Style/IndentHeredoc:
17
+ Enabled: false
18
+ Style/FormatString:
19
+ Enabled: false
20
+ Style/GuardClause:
21
+ Enabled: false
22
+ Style/PercentLiteralDelimiters: # Contradicting rule
23
+ Enabled: false
24
+ Style/SymbolArray: # Undefined syntax in Ruby 1.9.3
25
+ Enabled: false
26
+
@@ -1,6 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
+ - 2.4
5
+ - 2.3
4
6
  - 2.2
5
7
  - 2.0.0
6
8
  - 2.1
@@ -32,6 +34,6 @@ before_install:
32
34
  notifications:
33
35
  email:
34
36
  recipients:
35
- - temiola@google.com
37
+ - ruby-cloud-eng@google.com
36
38
  on_success: change
37
39
  on_failure: change
@@ -1,4 +1,11 @@
1
- ## 0.5.1 (06/01/2016)
1
+ ## 0.5.2 (2017/07/19)
2
+
3
+ ### Changes
4
+
5
+ * Add retry mechanism when fetching access tokens in `GCECredentials` and `UserRefreshCredentials` classes.
6
+ * Update Google API OAuth2 token credential URI to v4.
7
+
8
+ ## 0.5.1 (2016/01/06)
2
9
 
3
10
  ### Changes
4
11
 
@@ -6,14 +13,14 @@
6
13
  * Fix ADC not working on some windows machines ([@vsubramani][])
7
14
  [#55](https://github.com/google/google-auth-library-ruby/issues/55)
8
15
 
9
- ## 0.5.0 (12/10/2015)
16
+ ## 0.5.0 (2015/10/12)
10
17
 
11
18
  ### Changes
12
19
 
13
20
  * Initial support for user credentials ([@sqrrrl][])
14
21
  * Update Signet to 0.7
15
22
 
16
- ## 0.4.2 (05/08/2015)
23
+ ## 0.4.2 (2015/08/05)
17
24
 
18
25
  ### Changes
19
26
 
@@ -34,20 +41,20 @@
34
41
  * Enables passing credentials via environment variables. ([@haabaato][])
35
42
  [#27](https://github.com/google/google-auth-library-ruby/issues/27)
36
43
 
37
- ## 0.4.1 (25/04/2015)
44
+ ## 0.4.1 (2015/04/25)
38
45
 
39
46
  ### Changes
40
47
 
41
48
  * Improves handling of --no-scopes GCE authorization ([@tbetbetbe][])
42
49
  * Refactoring and cleanup ([@joneslee85][])
43
50
 
44
- ## 0.4.0 (25/03/2015)
51
+ ## 0.4.0 (2015/03/25)
45
52
 
46
53
  ### Changes
47
54
 
48
55
  * Adds an implementation of JWT header auth ([@tbetbetbe][])
49
56
 
50
- ## 0.3.0 (23/03/2015)
57
+ ## 0.3.0 (2015/03/23)
51
58
 
52
59
  ### Changes
53
60
 
data/Gemfile CHANGED
@@ -5,17 +5,17 @@ gemspec
5
5
 
6
6
  group :development do
7
7
  gem 'bundler', '~> 1.9'
8
- gem 'simplecov', '~> 0.9'
9
8
  gem 'coveralls', '~> 0.7'
10
9
  gem 'fakefs', '~> 0.6'
11
- gem 'rake', '~> 10.0'
12
- gem 'rubocop', '~> 0.30'
13
- gem 'rspec', '~> 3.0'
14
- gem 'redis', '~> 3.2'
15
10
  gem 'fakeredis', '~> 0.5'
16
- gem 'webmock', '~> 1.21'
17
11
  gem 'rack-test', '~> 0.6'
12
+ gem 'rake', '~> 10.0'
13
+ gem 'redis', '~> 3.2'
14
+ gem 'rspec', '~> 3.0'
15
+ gem 'rubocop', '~> 0.30'
16
+ gem 'simplecov', '~> 0.9'
18
17
  gem 'sinatra'
18
+ gem 'webmock', '~> 1.21'
19
19
  end
20
20
 
21
21
  platforms :jruby do
data/README.md CHANGED
@@ -70,7 +70,7 @@ a generic authorizer useful for command line apps or custom integrations as
70
70
  well as a web variant tailored toward Rack-based applications.
71
71
 
72
72
  The authorizers are intended for authorization use cases. For sign-on,
73
- see [Google Idenity Platform](https://developers.google.com/identity/)
73
+ see [Google Identity Platform](https://developers.google.com/identity/)
74
74
 
75
75
  ### Example (Web)
76
76
 
@@ -92,7 +92,7 @@ get('/authorize') do
92
92
  user_id = request.session['user_id']
93
93
  credentials = authorizer.get_credentials(user_id, request)
94
94
  if credentials.nil?
95
- redirect authorizer.get_authorization_url(user_id: user_id, request: request)
95
+ redirect authorizer.get_authorization_url(login_hint: user_id, request: request)
96
96
  end
97
97
  # Credentials are valid, can call APIs
98
98
  # ...
@@ -111,6 +111,8 @@ end
111
111
  require 'googleauth'
112
112
  require 'googleauth/stores/file_token_store'
113
113
 
114
+ OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
115
+
114
116
  scope = 'https://www.googleapis.com/auth/drive'
115
117
  client_id = Google::Auth::ClientId.from_file('/path/to/client_secrets.json')
116
118
  token_store = Google::Auth::Stores::FileTokenStore.new(
@@ -119,7 +121,7 @@ authorizer = Google::Auth::UserAuthorizer.new(client_id, scope, token_store)
119
121
 
120
122
  credentials = authorizer.get_credentials(user_id)
121
123
  if credentials.nil?
122
- url = authorizer.get_authorization_url(base_url: 'urn:ietf:wg:oauth:2.0:oob')
124
+ url = authorizer.get_authorization_url(base_url: OOB_URI )
123
125
  puts "Open #{url} in your browser and enter the resulting code:"
124
126
  code = gets
125
127
  credentials = authorizer.get_and_store_credentials_from_code(
@@ -129,6 +131,18 @@ end
129
131
  # OK to use credentials
130
132
  ```
131
133
 
134
+ ### Example (Service Account)
135
+
136
+ ```ruby
137
+ scope = 'https://www.googleapis.com/auth/androidpublisher'
138
+
139
+ authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
140
+ json_key_io: File.open('/path/to/service_account_json_key.json'),
141
+ scope: scope)
142
+
143
+ authorizer.fetch_access_token!
144
+ ```
145
+
132
146
  ### Storage
133
147
 
134
148
  Authorizers require a storage instance to manage long term persistence of
@@ -140,14 +154,6 @@ access and refresh tokens. Two storage implementations are included:
140
154
  Custom storage implementations can also be used. See
141
155
  [token_store.rb](lib/googleauth/token_store.rb) for additional details.
142
156
 
143
- ## What about auth in google-apis-ruby-client?
144
-
145
- The goal is for all auth done by
146
- [google-apis-ruby-client][google-apis-ruby-client] to be performed by this
147
- library. I.e, eventually google-apis-ruby-client will just take a dependency
148
- on this library. This update is a work in progress, but should be completed
149
- by Q2 2015.
150
-
151
157
  ## License
152
158
 
153
159
  This library is licensed under Apache 2.0. Full license text is
@@ -1,5 +1,6 @@
1
1
  # -*- ruby -*-
2
2
  # encoding: utf-8
3
+
3
4
  $LOAD_PATH.push File.expand_path('../lib', __FILE__)
4
5
  require 'googleauth/version'
5
6
 
@@ -25,7 +26,7 @@ Gem::Specification.new do |s|
25
26
  s.require_paths = ['lib']
26
27
  s.platform = Gem::Platform::RUBY
27
28
 
28
- s.add_dependency 'faraday', '~> 0.9'
29
+ s.add_dependency 'faraday', '~> 0.12'
29
30
  s.add_dependency 'logging', '~> 2.0'
30
31
  s.add_dependency 'jwt', '~> 1.4'
31
32
  s.add_dependency 'memoist', '~> 0.12'
@@ -42,7 +42,7 @@ module Google
42
42
  # Module Auth provides classes that provide Google-specific authorization
43
43
  # used to access Google APIs.
44
44
  module Auth
45
- NOT_FOUND_ERROR = <<END
45
+ NOT_FOUND_ERROR = <<END.freeze
46
46
  Could not load the default credentials. Browse to
47
47
  https://developers.google.com/accounts/docs/application-default-credentials
48
48
  for more information
@@ -70,14 +70,14 @@ END
70
70
  def self.read_creds
71
71
  env_var = CredentialsLoader::ACCOUNT_TYPE_VAR
72
72
  type = ENV[env_var]
73
- fail "#{ACCOUNT_TYPE_VAR} is undefined in env" unless type
73
+ raise "#{env_var} is undefined in env" unless type
74
74
  case type
75
75
  when 'service_account'
76
76
  ServiceAccountCredentials
77
77
  when 'authorized_user'
78
78
  UserRefreshCredentials
79
79
  else
80
- fail "credentials type '#{type}' is not supported"
80
+ raise "credentials type '#{type}' is not supported"
81
81
  end
82
82
  end
83
83
 
@@ -85,7 +85,7 @@ END
85
85
  def self.determine_creds_class(json_key_io)
86
86
  json_key = MultiJson.load(json_key_io.read)
87
87
  key = 'type'
88
- fail "the json is missing the '#{key}' field" unless json_key.key?(key)
88
+ raise "the json is missing the '#{key}' field" unless json_key.key?(key)
89
89
  type = json_key[key]
90
90
  case type
91
91
  when 'service_account'
@@ -93,7 +93,7 @@ END
93
93
  when 'authorized_user'
94
94
  [json_key, UserRefreshCredentials]
95
95
  else
96
- fail "credentials type '#{type}' is not supported"
96
+ raise "credentials type '#{type}' is not supported"
97
97
  end
98
98
  end
99
99
  end
@@ -116,7 +116,7 @@ END
116
116
  DefaultCredentials.from_well_known_path(scope) ||
117
117
  DefaultCredentials.from_system_default_path(scope)
118
118
  return creds unless creds.nil?
119
- fail NOT_FOUND_ERROR unless GCECredentials.on_gce?(options)
119
+ raise NOT_FOUND_ERROR unless GCECredentials.on_gce?(options)
120
120
  GCECredentials.new
121
121
  end
122
122
 
@@ -34,12 +34,12 @@ module Google
34
34
  # Representation of an application's identity for user authorization
35
35
  # flows.
36
36
  class ClientId
37
- INSTALLED_APP = 'installed'
38
- WEB_APP = 'web'
39
- CLIENT_ID = 'client_id'
40
- CLIENT_SECRET = 'client_secret'
37
+ INSTALLED_APP = 'installed'.freeze
38
+ WEB_APP = 'web'.freeze
39
+ CLIENT_ID = 'client_id'.freeze
40
+ CLIENT_SECRET = 'client_secret'.freeze
41
41
  MISSING_TOP_LEVEL_ELEMENT_ERROR =
42
- "Expected top level property 'installed' or 'web' to be present."
42
+ "Expected top level property 'installed' or 'web' to be present.".freeze
43
43
 
44
44
  # Text identifier of the client ID
45
45
  # @return [String]
@@ -63,8 +63,8 @@ module Google
63
63
  # & secrets in source. See {#from_file} to load from
64
64
  # `client_secrets.json` files.
65
65
  def initialize(id, secret)
66
- fail 'Client id can not be nil' if id.nil?
67
- fail 'Client secret can not be nil' if secret.nil?
66
+ raise 'Client id can not be nil' if id.nil?
67
+ raise 'Client secret can not be nil' if secret.nil?
68
68
  @id = id
69
69
  @secret = secret
70
70
  end
@@ -76,7 +76,7 @@ module Google
76
76
  # Path of file to read from
77
77
  # @return [Google::Auth::ClientID]
78
78
  def self.from_file(file)
79
- fail 'File can not be nil.' if file.nil?
79
+ raise 'File can not be nil.' if file.nil?
80
80
  File.open(file.to_s) do |f|
81
81
  json = f.read
82
82
  config = MultiJson.load(json)
@@ -92,9 +92,9 @@ module Google
92
92
  # Parsed contents of the JSON file
93
93
  # @return [Google::Auth::ClientID]
94
94
  def self.from_hash(config)
95
- fail 'Hash can not be nil.' if config.nil?
95
+ raise 'Hash can not be nil.' if config.nil?
96
96
  raw_detail = config[INSTALLED_APP] || config[WEB_APP]
97
- fail MISSING_TOP_LEVEL_ELEMENT_ERROR if raw_detail.nil?
97
+ raise MISSING_TOP_LEVEL_ELEMENT_ERROR if raw_detail.nil?
98
98
  ClientId.new(raw_detail[CLIENT_ID], raw_detail[CLIENT_SECRET])
99
99
  end
100
100
  end
@@ -35,13 +35,13 @@ module Google
35
35
  # Module Auth provides classes that provide Google-specific authorization
36
36
  # used to access Google APIs.
37
37
  module Auth
38
- NO_METADATA_SERVER_ERROR = <<END
38
+ NO_METADATA_SERVER_ERROR = <<END.freeze
39
39
  Error code 404 trying to get security access token
40
40
  from Compute Engine metadata for the default service account. This
41
41
  may be because the virtual machine instance does not have permission
42
42
  scopes specified.
43
43
  END
44
- UNEXPECTED_ERROR_SUFFIX = <<END
44
+ UNEXPECTED_ERROR_SUFFIX = <<END.freeze
45
45
  trying to get security access token from Compute Engine metadata for
46
46
  the default service account
47
47
  END
@@ -52,8 +52,8 @@ END
52
52
  # The IP Address is used in the URIs to speed up failures on non-GCE
53
53
  # systems.
54
54
  COMPUTE_AUTH_TOKEN_URI = 'http://169.254.169.254/computeMetadata/v1/'\
55
- 'instance/service-accounts/default/token'
56
- COMPUTE_CHECK_URI = 'http://169.254.169.254'
55
+ 'instance/service-accounts/default/token'.freeze
56
+ COMPUTE_CHECK_URI = 'http://169.254.169.254'.freeze
57
57
 
58
58
  class << self
59
59
  extend Memoist
@@ -88,16 +88,20 @@ END
88
88
  def fetch_access_token(options = {})
89
89
  c = options[:connection] || Faraday.default_connection
90
90
  c.headers = { 'Metadata-Flavor' => 'Google' }
91
- resp = c.get(COMPUTE_AUTH_TOKEN_URI)
92
- case resp.status
93
- when 200
94
- Signet::OAuth2.parse_credentials(resp.body,
95
- resp.headers['content-type'])
96
- when 404
97
- fail(Signet::AuthorizationError, NO_METADATA_SERVER_ERROR)
98
- else
99
- msg = "Unexpected error code #{resp.status}" + UNEXPECTED_ERROR_SUFFIX
100
- fail(Signet::AuthorizationError, msg)
91
+
92
+ retry_with_error do
93
+ resp = c.get(COMPUTE_AUTH_TOKEN_URI)
94
+ case resp.status
95
+ when 200
96
+ Signet::OAuth2.parse_credentials(resp.body,
97
+ resp.headers['content-type'])
98
+ when 404
99
+ raise(Signet::AuthorizationError, NO_METADATA_SERVER_ERROR)
100
+ else
101
+ msg = "Unexpected error code #{resp.status}" \
102
+ "#{UNEXPECTED_ERROR_SUFFIX}"
103
+ raise(Signet::AuthorizationError, msg)
104
+ end
101
105
  end
102
106
  end
103
107
  end
@@ -39,22 +39,23 @@ module Google
39
39
  # credentials files on the file system.
40
40
  module CredentialsLoader
41
41
  extend Memoist
42
- ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS'
42
+ ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS'.freeze
43
43
 
44
- PRIVATE_KEY_VAR = 'GOOGLE_PRIVATE_KEY'
45
- CLIENT_EMAIL_VAR = 'GOOGLE_CLIENT_EMAIL'
46
- CLIENT_ID_VAR = 'GOOGLE_CLIENT_ID'
47
- CLIENT_SECRET_VAR = 'GOOGLE_CLIENT_SECRET'
48
- REFRESH_TOKEN_VAR = 'GOOGLE_REFRESH_TOKEN'
49
- ACCOUNT_TYPE_VAR = 'GOOGLE_ACCOUNT_TYPE'
44
+ PRIVATE_KEY_VAR = 'GOOGLE_PRIVATE_KEY'.freeze
45
+ CLIENT_EMAIL_VAR = 'GOOGLE_CLIENT_EMAIL'.freeze
46
+ CLIENT_ID_VAR = 'GOOGLE_CLIENT_ID'.freeze
47
+ CLIENT_SECRET_VAR = 'GOOGLE_CLIENT_SECRET'.freeze
48
+ REFRESH_TOKEN_VAR = 'GOOGLE_REFRESH_TOKEN'.freeze
49
+ ACCOUNT_TYPE_VAR = 'GOOGLE_ACCOUNT_TYPE'.freeze
50
50
 
51
- CREDENTIALS_FILE_NAME = 'application_default_credentials.json'
51
+ CREDENTIALS_FILE_NAME = 'application_default_credentials.json'.freeze
52
52
  NOT_FOUND_ERROR =
53
- "Unable to read the credential file specified by #{ENV_VAR}"
54
- WELL_KNOWN_PATH = "gcloud/#{CREDENTIALS_FILE_NAME}"
55
- WELL_KNOWN_ERROR = 'Unable to read the default credential file'
53
+ "Unable to read the credential file specified by #{ENV_VAR}".freeze
54
+ WELL_KNOWN_PATH = "gcloud/#{CREDENTIALS_FILE_NAME}".freeze
55
+ WELL_KNOWN_ERROR = 'Unable to read the default credential file'.freeze
56
56
 
57
- SYSTEM_DEFAULT_ERROR = 'Unable to read the system default credential file'
57
+ SYSTEM_DEFAULT_ERROR =
58
+ 'Unable to read the system default credential file'.freeze
58
59
 
59
60
  # make_creds proxies the construction of a credentials instance
60
61
  #
@@ -71,7 +72,7 @@ module Google
71
72
  def from_env(scope = nil)
72
73
  if ENV.key?(ENV_VAR)
73
74
  path = ENV[ENV_VAR]
74
- fail "file #{path} does not exist" unless File.exist?(path)
75
+ raise "file #{path} does not exist" unless File.exist?(path)
75
76
  File.open(path) do |f|
76
77
  return make_creds(json_key_io: f, scope: scope)
77
78
  end
@@ -37,16 +37,16 @@ module Google
37
37
  module Auth
38
38
  # Authenticates requests using IAM credentials.
39
39
  class IAMCredentials
40
- SELECTOR_KEY = 'x-goog-iam-authority-selector'
41
- TOKEN_KEY = 'x-goog-iam-authorization-token'
40
+ SELECTOR_KEY = 'x-goog-iam-authority-selector'.freeze
41
+ TOKEN_KEY = 'x-goog-iam-authorization-token'.freeze
42
42
 
43
43
  # Initializes an IAMCredentials.
44
44
  #
45
45
  # @param selector the IAM selector.
46
46
  # @param token the IAM token.
47
47
  def initialize(selector, token)
48
- fail TypeError unless selector.is_a? String
49
- fail TypeError unless token.is_a? String
48
+ raise TypeError unless selector.is_a? String
49
+ raise TypeError unless token.is_a? String
50
50
  @selector = selector
51
51
  @token = token
52
52
  end
@@ -39,7 +39,7 @@ module Google
39
39
  'email' => 'https://www.googleapis.com/auth/userinfo.email',
40
40
  'profile' => 'https://www.googleapis.com/auth/userinfo.profile',
41
41
  'openid' => 'https://www.googleapis.com/auth/plus.me'
42
- }
42
+ }.freeze
43
43
 
44
44
  def self.normalize(scope)
45
45
  list = as_array(scope)
@@ -53,7 +53,7 @@ module Google
53
53
  when String
54
54
  scope.split(' ')
55
55
  else
56
- fail 'Invalid scope value. Must be string or array'
56
+ raise 'Invalid scope value. Must be string or array'
57
57
  end
58
58
  end
59
59
  end