zuora_api_oauth_alpha 2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,139 @@
1
+ module ZuoraAPI
2
+ class Basic < Login
3
+ attr_accessor :z_session_token
4
+
5
+ def initialize(**keyword_args)
6
+ super
7
+ end
8
+
9
+ def z_session_token=(val)
10
+ if !val.blank?
11
+ @z_session_token = val
12
+ self.current_session = @z_session_token
13
+ @stored_session_type = :basic
14
+ end
15
+ end
16
+
17
+ def authentication_prefix(auth_type = :basic)
18
+ return "ZSession "
19
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Basic Login, does not support Authentication of Type: #{auth_type}")
20
+ end
21
+
22
+ def check_session(auth_type = :basic)
23
+ return @z_session_token.blank?
24
+ end
25
+
26
+ def new_session(auth_type = :basic)
27
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Basic Login, does not support Authentication of Type: #{auth_type}") if auth_type != :basic
28
+ begin
29
+ tries ||= 2
30
+ request = Nokogiri::XML::Builder.new do |xml|
31
+ xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' =>"http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:api' => "http://api.zuora.com/" ) do
32
+ if (self.password.blank? && !@z_session_token.blank?)
33
+ Rails.logger.debug("Method [Session]")
34
+ xml['SOAP-ENV'].Header do
35
+ xml['api'].SessionHeader do
36
+ xml['api'].session @z_session_token
37
+ end
38
+ end
39
+ xml['SOAP-ENV'].Body do
40
+ xml['api'].getUserInfo
41
+ end
42
+ else
43
+ xml['SOAP-ENV'].Header
44
+ xml['SOAP-ENV'].Body do
45
+ xml['api'].login do
46
+ xml['api'].username self.username
47
+ xml['api'].password self.password
48
+ xml['api'].entityId self.entity_id if !self.entity_id.blank?
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ input_xml = Nokogiri::XML(request.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip)
56
+ input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
57
+ Rails.logger.debug('Connect') {"Request SOAP XML: #{input_xml.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip}"}# if debug
58
+
59
+ @response_query = HTTParty.post(self.url,:body => request.to_xml, :headers => {'Content-Type' => "text/xml; charset=utf-8"}, :timeout => 10)
60
+ @output_xml = Nokogiri::XML(@response_query.body)
61
+ Rails.logger.debug('Connect') {"Response SOAP XML: #{@output_xml.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip}"}# if debug
62
+
63
+ if !@response_query.success?
64
+ @z_session_token = nil
65
+ if @output_xml.namespaces.size > 0 && @output_xml.xpath('//soapenv:Fault').size > 0
66
+ self.current_error = @output_xml.xpath('//fns:FaultMessage', 'fns' =>'http://fault.api.zuora.com/').text
67
+ if self.current_error.include?('deactivated')
68
+ self.status = 'Deactivated'
69
+ self.current_error = 'Deactivated user login, please check with Zuora tenant administrator'
70
+ self.errors[:username] = self.current_error
71
+ elsif self.current_error.include?('inactive')
72
+ self.status = 'Inactive'
73
+ self.current_error = 'Inactive user login, please check with Zuora tenant administrator'
74
+ self.errors[:username] = self.current_error
75
+ elsif self.current_error.include?("invalid username or password") || self.current_error.include?("Invalid login. User name and password do not match.")
76
+ self.status = 'Invalid Login'
77
+ self.current_error = 'Invalid login, please check username and password or URL endpoint'
78
+ self.errors[:username] = self.current_error
79
+ self.errors[:password] = self.current_error
80
+ elsif self.current_error.include?('unsupported version')
81
+ self.status = 'Unsupported API Version'
82
+ self.current_error = 'Unsupported API version, please verify URL endpoint'
83
+ self.errors[:url] = self.current_error
84
+ elsif self.current_error.include?('invalid api version')
85
+ self.status = 'Invalid API Version'
86
+ self.current_error = 'Invalid API version, please verify URL endpoint'
87
+ self.errors[:url] = self.current_error
88
+ elsif self.current_error.include?('invalid session')
89
+ self.status = 'Invalid Session'
90
+ self.current_error = 'Session invalid, please update session and verify URL endpoint'
91
+ self.errors[:session] = self.current_error
92
+ elsif self.current_error.include?('Your IP address')
93
+ self.status = 'Restricted IP'
94
+ self.current_error = 'IP restricted, contact Zuora tenant administrator and remove IP restriction'
95
+ self.errors[:base] = self.current_error
96
+ elsif self.current_error.include?('This account has been locked')
97
+ self.status = 'Locked'
98
+ self.current_error = 'Locked user login, please wait or navigate to Zuora to unlock user'
99
+ self.errors[:username] = self.current_error
100
+ else
101
+ self.status = 'Unknown'
102
+ self.current_error = @output_xml.xpath('//faultstring').text if self.current_error.blank?
103
+ self.errors[:base] = self.current_error
104
+ end
105
+ else
106
+ self.current_error = "Code = #{@response_query.code} Message = #{@response_query.body.to_s}"
107
+ self.status = 'No Service'
108
+ end
109
+ else
110
+ #If Session only is used for Gem TODO Depercate
111
+ if (self.password.blank? && @z_session_token.present?)
112
+ @z_session_token = @z_session_token
113
+ self.username = @output_xml.xpath('//ns1:Username', 'ns1' =>'http://api.zuora.com/').text if self.username.blank?
114
+
115
+ #Username & password combo
116
+ elsif (self.password.present? && self.username.present?)
117
+ retrieved_session = @output_xml.xpath('//ns1:Session', 'ns1' =>'http://api.zuora.com/').text
118
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("No session found for api call.") if retrieved_session.blank?
119
+ @z_session_token = retrieved_session
120
+ end
121
+
122
+ self.current_error = nil
123
+ self.status = 'Active'
124
+ return @z_session_token
125
+ end
126
+ rescue Net::ReadTimeout, Net::OpenTimeout, Errno::EPIPE, Errno::ECONNRESET, Errno::ECONNREFUSED, SocketError => ex
127
+ if !(tries -= 1).zero?
128
+ Rails.logger.info {"#{ex.class} Timed out will retry after 5 seconds"}
129
+ sleep(self.timeout_sleep)
130
+ retry
131
+ else
132
+ self.current_error = "Request timed out. Try again"
133
+ self.status = 'Timeout'
134
+ return self.status
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,171 @@
1
+ module ZuoraAPI
2
+ class Oauth < Login
3
+ attr_accessor :z_session_token, :oauth_session_expires_at, :oauth_client_id, :oauth_secret, :bearer_token, :stored_session_type, :authentication_order_preference
4
+
5
+ def initialize(oauth_client_id: nil, oauth_secret: nil, z_session_token: nil, bearer_token: nil, oauth_session_expires_at: nil, **keyword_args)
6
+ @supported_authentication_types = [:basic, :bearer]
7
+ self.z_session_token = z_session_token if z_session_token.present?
8
+ self.bearer_token = bearer_token if z_session_token.present?
9
+ self.oauth_session_expires_at = oauth_session_expires_at if z_session_token.present?
10
+ @oauth_client_id = oauth_client_id
11
+ @oauth_secret = oauth_secret
12
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Request Oauth Login but either 'Oauth Client Id' or 'Oauth Secret' were not passed") if @oauth_client_id.blank? || @oauth_secret.blank?
13
+ super
14
+ end
15
+
16
+ def z_session_token=(val)
17
+ if !val.blank?
18
+ @z_session_token = val
19
+ self.current_session = @z_session_token
20
+ @stored_session_type = :basic
21
+ end
22
+ end
23
+
24
+ def oauth_session_expires_at=(val)
25
+ @oauth_session_expires_at = val if !val.blank?
26
+ end
27
+
28
+ def bearer_token=(val)
29
+ if !val.blank?
30
+ @bearer_token = val
31
+ self.current_session = @bearer_token
32
+ @stored_session_type = :bearer
33
+ end
34
+ end
35
+
36
+ def authentication_prefix(auth_type)
37
+ if auth_type == :bearer
38
+ return "Bearer "
39
+ elsif auth_type == :basic
40
+ return "ZSession "
41
+ else
42
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Oauth Login, does not support Authentication of Type: #{auth_type}") if !@supported_authentication_types.include?(auth_type)
43
+ end
44
+ end
45
+
46
+ def check_session(auth_type = :basic)
47
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Oauth Login, does not support Authentication of Type: #{auth_type}") if !@supported_authentication_types.include?(auth_type)
48
+ return true if (auth_type != @stored_session_type || @stored_session_type.nil?)
49
+ return false
50
+ end
51
+
52
+ def new_session(auth_type = :basic)
53
+ if auth_type == :basic
54
+ return get_z_session()
55
+ elsif auth_type == :bearer
56
+ return get_bearer_token()
57
+ else
58
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Oauth Login, does not support Authentication of Type: #{auth_type}") if !@supported_authentication_types.include?(auth_type)
59
+ end
60
+ end
61
+
62
+ def get_z_session(debug = false)
63
+ begin
64
+ tries ||= 2
65
+ get_bearer_token()
66
+ if !@entity_id.nil?
67
+ response = HTTParty.get(self.rest_endpoint("connections"), headers: {:Authorization => "Bearer " + @bearer_token , :entityId => @entity_id })
68
+ else
69
+ response = HTTParty.get(self.rest_endpoint("connections"), headers: {:Authorization => "Bearer " + @bearer_token})
70
+ end
71
+ if JSON.parse(response.body)["success"] ##.to_bool
72
+ @z_session_token = response.headers.to_h['set-cookie'][0].split(';')[0].split('=',2)[1]
73
+ @stored_session_type = :basic
74
+ self.current_error = nil
75
+ self.status = 'Active'
76
+ else
77
+ self.current_error = JSON.parse(response.body)["reasons"][0]["message"]
78
+ self.status = "Invalid"
79
+ end
80
+
81
+ return @z_session_token
82
+ rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
83
+ if !(tries -= 1).zero? && z_session
84
+ Rails.logger.debug {"Session Invalid"}
85
+ self.new_session
86
+ retry
87
+ else
88
+ if errors.include?(ex.class)
89
+ raise ex
90
+ else
91
+ return [output_json, response]
92
+ end
93
+ end
94
+ rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
95
+ if errors.include?(ex.class)
96
+ raise ex
97
+ else
98
+ return [output_json, response]
99
+ end
100
+ rescue Net::ReadTimeout, Net::OpenTimeout, Errno::EPIPE, Errno::ECONNRESET, Errno::ECONNREFUSED, SocketError => ex
101
+ if !(tries -= 1).zero?
102
+ Rails.logger.info {"#{ex.class} Timed out will retry after 5 seconds"}
103
+ sleep(self.timeout_sleep)
104
+ retry
105
+ else
106
+ self.current_error = "Request timed out. Try again"
107
+ self.status = 'Timeout'
108
+ return self.status
109
+ end
110
+ end
111
+ end
112
+
113
+ def get_bearer_token
114
+ begin
115
+ tries ||= 2
116
+ if !oauth_expired?
117
+ self.current_error = nil
118
+ self.status = 'Active'
119
+ else
120
+ encoded_url = URI.encode(self.rest_endpoint.chomp('v1/').concat('oauth/token'))
121
+ url = URI.parse(encoded_url)
122
+ response = HTTParty.post(url,:headers => {:content_type => "application/x-www-form-urlencoded"}, :body => {:client_id=>@oauth_client_id, :client_secret=>@oauth_secret, :grant_type=>"client_credentials"})
123
+ if JSON.parse(response.body)["error"].nil?
124
+ @bearer_token = JSON.parse(response.body)["access_token"]
125
+ @oauth_session_expires_at = Time.now.to_i + JSON.parse(response.body)["expires_in"].to_i
126
+ @stored_session_type = :bearer
127
+ self.current_error = nil
128
+ self.status = 'Active'
129
+ else
130
+ self.current_error = "Problem with the Credentials"
131
+ self.status = 'Invalid'
132
+ end
133
+ end
134
+
135
+ return @bearer_token
136
+ rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
137
+ if !(tries -= 1).zero? && z_session
138
+ Rails.logger.debug {"Session Invalid"}
139
+ self.new_session
140
+ retry
141
+ else
142
+ if errors.include?(ex.class)
143
+ raise ex
144
+ else
145
+ return [output_json, response]
146
+ end
147
+ end
148
+ rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
149
+ if errors.include?(ex.class)
150
+ raise ex
151
+ else
152
+ return [output_json, response]
153
+ end
154
+ rescue Net::ReadTimeout, Net::OpenTimeout, Errno::EPIPE, Errno::ECONNRESET, Errno::ECONNREFUSED, SocketError => ex
155
+ if !(tries -= 1).zero?
156
+ Rails.logger.info {"#{ex.class} Timed out will retry after 5 seconds"}
157
+ sleep(self.timeout_sleep)
158
+ retry
159
+ else
160
+ self.current_error = "Request timed out. Try again"
161
+ self.status = 'Timeout'
162
+ return self.status
163
+ end
164
+ end
165
+ end
166
+
167
+ def oauth_expired?
168
+ return @oauth_session_expires_at.nil? ? true : (@oauth_session_expires_at < Time.now.to_i)
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,3 @@
1
+ module ZuoraAPI
2
+ VERSION = "2"
3
+ end
@@ -0,0 +1,10 @@
1
+ require 'rails'
2
+ require "zuora_api_oauth_alpha/login"
3
+ require "zuora_api_oauth_alpha/logins/basic"
4
+ require "zuora_api_oauth_alpha/logins/oauth"
5
+ require 'zuora_api_oauth_alpha/exceptions'
6
+ require "insights_api/login"
7
+
8
+ module ZuoraAPI
9
+ # Your code goes here...
10
+ end
metadata ADDED
@@ -0,0 +1,185 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zuora_api_oauth_alpha
3
+ version: !ruby/object:Gem::Version
4
+ version: '2'
5
+ platform: ruby
6
+ authors:
7
+ - Zuora Strategic Solutions Group
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.6.8
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.6.8
97
+ - !ruby/object:Gem::Dependency
98
+ name: httparty
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubyzip
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: railties
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 4.1.0
132
+ - - "<"
133
+ - !ruby/object:Gem::Version
134
+ version: '5.1'
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: 4.1.0
142
+ - - "<"
143
+ - !ruby/object:Gem::Version
144
+ version: '5.1'
145
+ description: Gem that provides easy integration to Zuora
146
+ email:
147
+ - connect@zuora.com
148
+ executables: []
149
+ extensions: []
150
+ extra_rdoc_files: []
151
+ files:
152
+ - Rakefile
153
+ - lib/insights_api/login.rb
154
+ - lib/zuora_api_oauth_alpha.rb
155
+ - lib/zuora_api_oauth_alpha/exceptions.rb
156
+ - lib/zuora_api_oauth_alpha/login.rb
157
+ - lib/zuora_api_oauth_alpha/logins/basic.rb
158
+ - lib/zuora_api_oauth_alpha/logins/oauth.rb
159
+ - lib/zuora_api_oauth_alpha/version.rb
160
+ homepage: https://connect.zuora.com
161
+ licenses: []
162
+ metadata: {}
163
+ post_install_message:
164
+ rdoc_options: []
165
+ require_paths:
166
+ - lib
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ requirements: []
178
+ rubyforge_project:
179
+ rubygems_version: 2.7.4
180
+ signing_key:
181
+ specification_version: 4
182
+ summary: Gem that provides easy integration to Zuora | this is an unstable alpha release
183
+ and the connect team will not provide an commitment to the functionalilty until
184
+ a formal release of the gem
185
+ test_files: []