google-ads-common 0.9.9 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MmEwMDIzYWQwNzlmYjA4ZjE0OTMzZmMwZjg4YjQ4ZDIxNGRlMDdjOA==
4
+ ODExZjI0NTAwNDdmOWY2NzcxNGMwZmJlNDc1ZTg4YmRkYWVmM2VlMg==
5
5
  data.tar.gz: !binary |-
6
- ZTg0NmJiYmFlOWJkYjA4NDhjYTRiNzVhOTNjYmNhZWQ0Mjk0NjYzMg==
6
+ YzdhOWY3OGMxMjYxMzJjYTZhY2YwNTMyY2YwZmU4YmVkZjAxMzM5OA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MGZkMGUwMWQ2ZjkyNzk2MGMyMjU4YzFkMDEyYzAxMDY1ZGQ0NTdjZDRhMTMy
10
- OGJkY2Q0NmU2NTZhYmZiYzEzODY4ZGZkN2EwMjVkNDY3NzAxZDBkYjcwM2E5
11
- N2I2ZjFjMzAxNGQ1MzhjMjFjMWU0MmE4NmY2YmZlZWI5MjkxNzY=
9
+ MTllZWU2NDdhOWU1YzExNTYxM2ZjNTI5MzA1OTY5NzgwNDBiYzRmMTFiNDQ0
10
+ NmVhMWQ0NmJiNjY0MjFlNzFmYmRiNjNlYzdhNjgyMjIxN2E5Njc1Zjk3NTVl
11
+ MTdiMjhkZWQ1YTJjMmQzOTU5YWUwN2U0YjAzNGY5MmYxOWE1N2U=
12
12
  data.tar.gz: !binary |-
13
- OGEwNmUyZTVkYWE5Yzg1ODcxNWYyYjQ3ZTI0YWRhYjcxZDhiYmMyNDlkMTRj
14
- OGM5OTM5NTRlODlmNTU4ZTdmYTZmZmM1ODk2NzM2M2M3Mjg1ZDJhYjYzM2Yw
15
- Mzc3MDk0MGI2ZjRlMTA0YzU2NTg2OThkNDA2ZDA3OTM1ZGI3Y2Q=
13
+ MjZkNTA3MWE0ZTJlY2U2ODM0OGM2MTg2NGIyYzY5ZDE4MDM3NWEzYjM3Yjk5
14
+ MmM0ODQ3NDdhNjI5MjE2YWQ1ZGFjMDI0NDViMmEwNzdhY2UxOTIwOTNiZjc0
15
+ ZTIwNjFmOGQ1YWExNTM2OWM4NjAyNmE2MzY1YTI4YWI4NTM3OTc=
data/ChangeLog CHANGED
@@ -1,3 +1,6 @@
1
+ 0.10.0:
2
+ - Renamed all references of OAUTH2 JWT to OAUTH2 Service Account.
3
+
1
4
  0.9.9:
2
5
  - Fixing minor issue where signet doesn't handle String-based times.
3
6
 
@@ -25,7 +25,7 @@ require 'ads_common/config'
25
25
  require 'ads_common/errors'
26
26
  require 'ads_common/utils'
27
27
  require 'ads_common/auth/oauth2_handler'
28
- require 'ads_common/auth/oauth2_jwt_handler'
28
+ require 'ads_common/auth/oauth2_service_account_handler'
29
29
 
30
30
  module AdsCommon
31
31
  class Api
@@ -201,10 +201,10 @@ module AdsCommon
201
201
  @config,
202
202
  api_config.environment_config(environment, :oauth_scope)
203
203
  )
204
- when :OAUTH2_JWT
204
+ when :OAUTH2_SERVICE_ACCOUNT_
205
205
  environment = @config.read('service.environment',
206
206
  api_config.default_environment())
207
- AdsCommon::Auth::OAuth2JwtHandler.new(
207
+ AdsCommon::Auth::OAuth2ServiceAccountHandler.new(
208
208
  @config,
209
209
  api_config.environment_config(environment, :oauth_scope)
210
210
  )
@@ -17,7 +17,7 @@
17
17
  # See the License for the specific language governing permissions and
18
18
  # limitations under the License.
19
19
  #
20
- # This module manages OAuth2.0 JWT authentication.
20
+ # This module manages OAuth2.0 service account authentication.
21
21
 
22
22
  require 'faraday'
23
23
  require 'signet/oauth_2/client'
@@ -29,7 +29,7 @@ module AdsCommon
29
29
  module Auth
30
30
 
31
31
  # Credentials class to handle OAuth2.0 authentication.
32
- class OAuth2JwtHandler < AdsCommon::Auth::BaseHandler
32
+ class OAuth2ServiceAccountHandler < AdsCommon::Auth::BaseHandler
33
33
 
34
34
  OAUTH2_CONFIG = {
35
35
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
@@ -60,7 +60,8 @@ module AdsCommon
60
60
  raise error
61
61
  end
62
62
 
63
- # Generates auth string for OAuth2.0 JWT method of authentication.
63
+ # Generates auth string for OAuth2.0 service account method of
64
+ # authentication.
64
65
  #
65
66
  # Args:
66
67
  # - credentials: credentials set for authorization
@@ -91,7 +92,8 @@ module AdsCommon
91
92
 
92
93
  private
93
94
 
94
- # Auxiliary method to validate the credentials for JWT authentication.
95
+ # Auxiliary method to validate the credentials for service account
96
+ # authentication.
95
97
  #
96
98
  # Args:
97
99
  # - credentials: a hash with the credentials for the account being
@@ -121,18 +123,18 @@ module AdsCommon
121
123
 
122
124
  if credentials[:oauth2_key].nil? && credentials[:oauth2_keyfile].nil?
123
125
  raise AdsCommon::Errors::AuthError,
124
- 'Either key or key file must be provided for OAuth2 JWT.'
126
+ 'Either key or key file must be provided for OAuth2 service account.'
125
127
  end
126
128
 
127
129
  if credentials[:oauth2_key] && credentials[:oauth2_keyfile]
128
130
  raise AdsCommon::Errors::AuthError,
129
- 'Both JWT key and key file provided, only one can be used.'
131
+ 'Both service account key and key file provided, only one can be used.'
130
132
  end
131
133
 
132
134
  if credentials[:oauth2_key] &&
133
135
  !credentials[:oauth2_key].kind_of?(OpenSSL::PKey::RSA)
134
136
  raise AdsCommon::Errors::AuthError,
135
- 'OAuth2 JWT key provided must be of type OpenSSL::PKey::RSA.'
137
+ 'OAuth2 service account key provided must be of type OpenSSL::PKey::RSA.'
136
138
  end
137
139
 
138
140
  if credentials[:oauth2_keyfile] &&
@@ -167,7 +169,7 @@ module AdsCommon
167
169
 
168
170
  # Creates a Signet client based on credentials.
169
171
  def create_client(credentials)
170
- credentials = load_oauth2_jwt_credentials(credentials)
172
+ credentials = load_oauth2_service_account_credentials(credentials)
171
173
  oauth_options = OAUTH2_CONFIG.merge({
172
174
  :issuer => credentials[:oauth2_issuer],
173
175
  :signing_key => credentials[:oauth2_key],
@@ -177,8 +179,8 @@ module AdsCommon
177
179
  return Signet::OAuth2::Client.new(oauth_options)
178
180
  end
179
181
 
180
- # Loads JWT key if configured with a filename.
181
- def load_oauth2_jwt_credentials(credentials)
182
+ # Loads service account key if configured with a filename.
183
+ def load_oauth2_service_account_credentials(credentials)
182
184
  return credentials unless credentials.include?(:oauth2_keyfile)
183
185
  key_file = File.read(credentials[:oauth2_keyfile])
184
186
  key_secret = credentials[:oauth2_secret]
@@ -21,6 +21,6 @@
21
21
 
22
22
  module AdsCommon
23
23
  module ApiConfig
24
- CLIENT_LIB_VERSION = '0.9.9'
24
+ CLIENT_LIB_VERSION = '0.10.0'
25
25
  end
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-ads-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergio Gomes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-06-04 00:00:00.000000000 Z
12
+ date: 2015-07-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: savon
@@ -66,9 +66,8 @@ files:
66
66
  - lib/ads_common/api.rb
67
67
  - lib/ads_common/api_config.rb
68
68
  - lib/ads_common/auth/base_handler.rb
69
- - lib/ads_common/auth/client_login_handler.rb
70
69
  - lib/ads_common/auth/oauth2_handler.rb
71
- - lib/ads_common/auth/oauth2_jwt_handler.rb
70
+ - lib/ads_common/auth/oauth2_service_account_handler.rb
72
71
  - lib/ads_common/build/savon_abstract_generator.rb
73
72
  - lib/ads_common/build/savon_generator.rb
74
73
  - lib/ads_common/build/savon_registry.rb
@@ -1,198 +0,0 @@
1
- # Encoding: utf-8
2
- #
3
- # Authors:: api.dklimkin@gmail.com (Danial Klimkin)
4
- #
5
- # Copyright:: Copyright 2010, Google Inc. All Rights Reserved.
6
- #
7
- # License:: Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
- # implied.
17
- # See the License for the specific language governing permissions and
18
- # limitations under the License.
19
- #
20
- # This module manages ClientLogin authentication. It either uses a user-provided
21
- # auth token, or automatically connects to Google's ClientLogin service and
22
- # generates an auth token that can be used to login to an API.
23
-
24
- require 'cgi'
25
- require 'ads_common/http'
26
- require 'ads_common/auth/base_handler'
27
- require 'ads_common/errors'
28
-
29
- module AdsCommon
30
- module Auth
31
-
32
- # Credentials class to handle ClientLogin authentication.
33
- class ClientLoginHandler < AdsCommon::Auth::BaseHandler
34
- ACCOUNT_TYPE = 'GOOGLE'
35
- AUTH_PATH = '/accounts/ClientLogin'
36
- AUTH_PREFIX = 'GoogleLogin auth='
37
- CAPTCHA_PATH = '/accounts/'
38
-
39
- # Initializes the ClientLoginHandler with all the necessary details.
40
- def initialize(config, auth_server, service_name)
41
- super(config)
42
- @server = auth_server
43
- @service_name = service_name
44
- end
45
-
46
- # Invalidates the stored token if the email, password or provided auth
47
- # token have changed.
48
- def property_changed(prop, value)
49
- if [:email, :password].include?(prop)
50
- @token = nil
51
- end
52
- if :auth_token.eql?(prop)
53
- @token = create_token_from_string(value)
54
- end
55
- end
56
-
57
- # Handle specific ClientLogin errors.
58
- def handle_error(error)
59
- # TODO: Add support for automatically regenerating auth tokens when they
60
- # expire.
61
- get_logger().error(error)
62
- raise error
63
- end
64
-
65
- # Returns authorization string.
66
- def auth_string(credentials)
67
- return [AUTH_PREFIX, get_token(credentials)].join
68
- end
69
-
70
- private
71
-
72
- # Auxiliary method to validate the credentials for token generation.
73
- #
74
- # Args:
75
- # - credentials: a hash with the credentials for the account being
76
- # accessed
77
- #
78
- # Raises:
79
- # - AdsCommon::Errors::AuthError if validation fails
80
- #
81
- def validate_credentials(credentials)
82
- if credentials.nil?
83
- raise AdsCommon::Errors::AuthError, 'No credentials supplied.'
84
- end
85
-
86
- if credentials[:auth_token].nil?
87
- if credentials[:email].nil?
88
- raise AdsCommon::Errors::AuthError,
89
- 'Email address not included in credentials.'
90
- end
91
- if credentials[:password].nil?
92
- raise AdsCommon::Errors::AuthError,
93
- 'Password not included in credentials.'
94
- end
95
- else
96
- if credentials[:email] and credentials[:password]
97
- get_logger().warn('Both auth_token and login credentials present' +
98
- ', preferring auth_token.')
99
- end
100
- end
101
- end
102
-
103
- # Auxiliary method to generate an authentication token for login in via
104
- # the ClientLogin API.
105
- #
106
- # Args:
107
- # - credentials: a hash with the credentials for the account being
108
- # accessed
109
- #
110
- # Returns:
111
- # - The auth token for the account
112
- #
113
- # Raises:
114
- # - AdsCommon::Errors::AuthError if authentication fails
115
- #
116
- def create_token(credentials)
117
- token = credentials.include?(:auth_token) ?
118
- create_token_from_string(credentials[:auth_token]) :
119
- generate_token(credentials)
120
- return token
121
- end
122
-
123
- # Creates token for provided auth string. Trivial for this handler.
124
- def create_token_from_string(token_string)
125
- return token_string
126
- end
127
-
128
- # Prepares POST data for ClientLogin request.
129
- def get_login_data(credentials)
130
- email = CGI.escape(credentials[:email])
131
- password = CGI.escape(credentials[:password])
132
- service_name = @service_name
133
- data = "accountType=%s&Email=%s&Passwd=%s&service=%s" %
134
- [ACCOUNT_TYPE, email, password, service_name]
135
- if credentials[:logintoken] and credentials[:logincaptcha]
136
- data += "&logintoken=%s&logincaptcha=%s" %
137
- [CGI.escape(credentials[:logintoken]),
138
- CGI.escape(credentials[:logincaptcha])]
139
- end
140
- return data
141
- end
142
-
143
- # Generates new client login token based on credentials.
144
- def generate_token(credentials)
145
- validate_credentials(credentials)
146
-
147
- url = @server + AUTH_PATH
148
- data = get_login_data(credentials)
149
- headers = {'Content-Type' => 'application/x-www-form-urlencoded'}
150
-
151
- response = AdsCommon::Http.post_response(url, data, @config, headers)
152
- results = parse_token_text(response.body)
153
-
154
- if response.code == 200 and results.include?('Auth')
155
- return results['Auth']
156
- else
157
- handle_login_error(credentials, response, results)
158
- end
159
- end
160
-
161
- # Raises relevant error based on response and parsed results.
162
- def handle_login_error(credentials, response, results)
163
- # Handling for known errors.
164
- if 'CaptchaRequired'.eql?(results['Error'])
165
- captcha_url = @server + CAPTCHA_PATH + results['CaptchaUrl']
166
- raise AdsCommon::Errors::CaptchaRequiredError.new(results['Error'],
167
- results['CaptchaToken'], captcha_url, results['Url'])
168
- end
169
- # For other errors throwing a generic error.
170
- error_message = "ClientLogin failed for email '%s': HTTP code %d." %
171
- [credentials[:email], response.code]
172
- error_str = results['Error'] || response.body
173
- error_message += " Error: %s." % error_str if error_str
174
- if results.include?('Info')
175
- error_message += " Info: %s." % results['Info']
176
- end
177
- raise AdsCommon::Errors::AuthError.new(error_message, error_str,
178
- results['Info'])
179
- end
180
-
181
- # Extracts key-value pairs from ClientLogin server response.
182
- #
183
- # Args:
184
- # - text: server response string
185
- #
186
- # Returns:
187
- # Hash of key-value pairs
188
- #
189
- def parse_token_text(text)
190
- return text.split("\n").inject({}) do |result, line|
191
- key, *values = line.split('=')
192
- result[key] = values.join('=')
193
- result
194
- end
195
- end
196
- end
197
- end
198
- end