nm-gigya 0.1.20 → 0.1.26

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 750c93385f69b17c6e9b18f0b24dd2c8de78f73a56e9056938cbbd2af5cf9b95
4
- data.tar.gz: 4ed2d9401b51060ce1ae37420e2905c2e4a4c8fb67dedc1982e5d18704434fe9
3
+ metadata.gz: b8253c94735c73d0870a148bfc7babdf2da0bc6baab966ba4c0d7207ce33f90f
4
+ data.tar.gz: b4ebd99810c2e3283a86c33982934ef47cd4627ca2068c5622200331118b7efc
5
5
  SHA512:
6
- metadata.gz: 22fb90438a1aab32b86f35ad22965e78c40bf6cafa33283d018a09704e76111da93a832896f59c4f3a19873f402b5feff56e05d959b26586fae26f8a30bab702
7
- data.tar.gz: e88ccc6ce71ee3789969fc44d0e20d13879c69d793c09ed7e005a426c5fbb9d618027186af54587f5b714a754609f678799a6ebe126712caa9b8081c0c6806ab
6
+ metadata.gz: 18216ea8d1ef4c8ee108349cbcbf473d4743a4f76604fe72a973241a735265576eb4be4a406b72daa465ffa6dede7e0ba328717aa7a233f579f5ed4376421847
7
+ data.tar.gz: 6d9146dce8eb144384c6d1824172526b9856c37bdf9510006829e14ec380f6cbf9010d96e1da2f334bb2c933fdef342d9144a0ac85e2fee7ed34b00f4c03fb2c
@@ -153,6 +153,7 @@ module Gigya
153
153
 
154
154
  class Connection
155
155
  attr_accessor :jwt_skip_validation
156
+ attr_accessor :whitelisted_api_keys
156
157
 
157
158
  GIGYA_BASE_URL="gigya.com"
158
159
  def self.shared_connection
@@ -164,6 +165,10 @@ module Gigya
164
165
  :user_secret => ENV["GIGYA_USER_SECRET"],
165
166
  :debug_connection => ENV["GIGYA_DEBUG_CONNECTION"] == "1"
166
167
  )
168
+
169
+ whitelist = ENV["GIGYA_WHITELISTED_API_KEYS"]
170
+ conn.whitelisted_api_keys => whitelist.split(",") unless whitelist.blank?
171
+
167
172
  conn.jwt_skip_validation = false
168
173
  conn
169
174
  end
@@ -263,6 +268,18 @@ module Gigya
263
268
 
264
269
  return user_jwt_info if jwt_skip_validation
265
270
 
271
+ # If we have enumerated whitelisted API keys
272
+ unless whitelisted_api_keys.nil?
273
+ # Grab the API key encoded in the token
274
+ jwt_api_key = user_jwt_info["apiKey"]
275
+
276
+ # Our own API key is automatically valid
277
+ if jwt_api_key != api_key
278
+ # Make sure it is listed in the whitelisted keys
279
+ raise "Invalid API Key" unless whitelisted_api_keys.include?(jwt_api_key)
280
+ end
281
+ end
282
+
266
283
  signing_key_id = signing_jwt_info["keyid"]
267
284
  @cached_data["jwt_public_keys"] ||= {}
268
285
  k = @cached_data["jwt_public_keys"][signing_key_id]
@@ -292,6 +309,15 @@ module Gigya
292
309
  api_call("POST", area, function, params, opts)
293
310
  end
294
311
 
312
+ # This allows substituting how HTTP calls are made (could be useful for testing)
313
+ def http_driver
314
+ @http_driver || HTTParty
315
+ end
316
+
317
+ def http_driver=(val)
318
+ @http_driver = val
319
+ end
320
+
295
321
  def api_call(http_method, area, function, params = nil, opts = nil)
296
322
  params ||= {}
297
323
  opts ||= {}
@@ -302,7 +328,7 @@ module Gigya
302
328
  params[:apiKey] = opts[:api_key]
303
329
  unless opts[:authenticate_app] == false
304
330
  params[:secret] = opts[:user_secret]
305
- params[:userKey] = opts[:user_key]
331
+ params[:userKey] = opts[:user_key] unless opts[:user_key].blank?
306
332
  end
307
333
 
308
334
  if opts[:session] != nil
@@ -319,7 +345,7 @@ module Gigya
319
345
  end
320
346
  http_response = nil
321
347
  response = begin
322
- http_response = http_method == "GET" ? HTTParty.get(base_url, :query => params) : HTTParty.post(base_url, :body => params)
348
+ http_response = http_method == "GET" ? http_driver.get(base_url, :query => params) : http_driver.post(base_url, :body => params)
323
349
  JSON.parse(http_response.body)
324
350
  rescue
325
351
  {"errorCode" => 600, "errorMessage" => "Unknown error", "errorDetail" => "Unable to communicate with authentication server", :http => http_response.inspect}
@@ -62,7 +62,7 @@ module Gigya
62
62
 
63
63
  begin
64
64
  if tmp_token.blank?
65
- tmp_token = session[GIGYA_SESSION_PARAM]
65
+ tmp_token = session[GIGYA_SESSION_PARAM]
66
66
  token_location = :session
67
67
  end
68
68
  rescue
@@ -78,7 +78,7 @@ module Gigya
78
78
  end
79
79
 
80
80
  def interpret_jwt_token(force = false)
81
- if @gigya_jwt_info.nil?
81
+ if @gigya_jwt_info.nil?
82
82
  @gigya_jwt_info = Gigya::Connection.shared_connection.validate_jwt(gigya_jwt_token)
83
83
 
84
84
  perform_token_refresh if needs_token_refresh?
@@ -114,7 +114,7 @@ module Gigya
114
114
  case @gigya_token_location
115
115
  when :header
116
116
  headers["X-Set-Authorization-Token"] = token
117
- headers["X-Set-Authorization-Token-Expiration"] = expiration_time.to_i
117
+ headers["X-Set-Authorization-Token-Expiration"] = expiration_time.to_i.to_s
118
118
  when :cookie
119
119
  cookies[GIGYA_COOKIE_PARAM] = token
120
120
  when :session
@@ -160,5 +160,5 @@ module Gigya
160
160
  @gigya_jwt_info["sub"]
161
161
  end
162
162
  end
163
- end
163
+ end
164
164
  end
@@ -50,7 +50,7 @@ module Gigya
50
50
  end
51
51
 
52
52
  def reload
53
- conn = gigya_connection || Gigya::Connection.shared_connection
53
+ conn = my_gigya_connection
54
54
  set_attributes(conn.api_get("accounts", "getAccountInfo", {UID: uid, include:"profile,data,subscriptions,userInfo,preferences", extraProfileFields:@@extra_profile_fields.join(",")}))
55
55
  end
56
56
 
@@ -60,7 +60,7 @@ module Gigya
60
60
  info["data"] = gigya_details["data"].to_json if gigya_details["data"].present?
61
61
  # What about isActive, isVerified?, password/newPassword, preferences, add/removeLoginEmails, subscriptions, lang, rba
62
62
 
63
- conn = gigya_connection || Gigya::Connection.shared_connection
63
+ conn = my_gigya_connection
64
64
  conn.api_post("accounts", "setAccountInfo", info)
65
65
  save_to_cache
66
66
 
@@ -97,7 +97,7 @@ module Gigya
97
97
 
98
98
  def self.find(uid, opts = {}) # Find a Gigya account record by its UID attribute
99
99
  opts = {} if opts.nil?
100
- opts[:cache] = true if opts[:cache].nil?
100
+ opts[:cache] = true if opts[:cache].nil?
101
101
 
102
102
  cache_info = load_from_cache(uid)
103
103
  if cache_info.present? && opts[:cache]
@@ -163,5 +163,135 @@ module Gigya
163
163
  nil
164
164
  end
165
165
  end
166
+
167
+
168
+ # Intended way of calling this:
169
+ # Gigya::User.create_gigya_user_through_notify_login("abc@example.com", :password => "Abc123!!", :account => { "preferences" => {"foo" => "bar" } }, :verified => true)
170
+ #
171
+ # Options:
172
+ # :password => Set a password,
173
+ # :source => the registration source
174
+ # :account => hash of any account defaults you want to set. Profile defaults should be under the "profile" key.
175
+ # :send_verification => Will send verification email
176
+ # :verified => Will auto-set "verified"
177
+ # :force => Will do things that Gigya doesn't naturally want to do (often used in combination with :verified)
178
+ # :debug => will print out call information
179
+
180
+ # Creates a gigya user through the `notify_login` pathway
181
+ def self.create_gigya_user_through_notify_login(email, opts = {})
182
+ conn = opts[:gigya_connection] || Gigya::Connection.shared_connection
183
+
184
+ # Create UUID
185
+ new_uid = opts[:UID] || "#{SecureRandom.uuid.gsub("-", "")}#{SecureRandom.uuid.gsub("-", "")}"
186
+
187
+ # Is the address available?
188
+ email_is_available = conn.api_get("accounts", "isAvailableLoginID", { "loginID" => email }, :debug_connection => opts[:debug])["isAvailable"] rescue false
189
+ raise "Username is unavailable" unless email_is_available
190
+
191
+ # Register UUID
192
+ response = conn.api_get("accounts", "notifyLogin", {"siteUID" => new_uid}, :debug_connection => opts[:debug])
193
+ raise "Could not register UID" unless response["errorCode"] == 0 || response["errorCode"] == 206001
194
+
195
+ # Start the registration process
196
+ regtoken = conn.api_get("accounts", "initRegistration", {}, :debug_connection => opts[:debug])["regToken"] rescue nil
197
+ raise "Could not initiate registration" if regtoken.blank?
198
+
199
+ # Create the data record
200
+ account_info = opts[:account] || {} # This allows the caller to send us defaults
201
+ account_info["UID"] = new_uid # Primary key
202
+ account_info["regToken"] = regtoken # Ties it to the initial registration
203
+ account_info["securityOverride"] = true # Allows us to set passwords if we want
204
+ account_info["profile"] ||= {}
205
+ account_info["profile"]["email"] = email # Actual login username
206
+ account_info["profile"] = account_info["profile"].to_json
207
+ account_info["preferences"] = account_info["preferences"].to_json
208
+ account_info["regSource"] = opts[:source] || "nm-gigya"
209
+
210
+ # Optional data record pieces
211
+ account_info["isVerified"] = true if opts[:verified]
212
+ account_info["newPassword"] = opts[:password] unless opts[:password].blank?
213
+
214
+ # Create the registration with the data record
215
+ results = conn.api_post("accounts", "setAccountInfo", account_info, :debug_connection => opts[:debug])
216
+
217
+ # If not everything got set correctly (NOTE - doesn't work if :password is not also sent)
218
+ if opts[:force]
219
+ response = conn.api_get("accounts", "login", {"loginID" => email, "password" => opts[:password]}, :debug_connection => opts[:debug])
220
+ if response["errorCode"] != 0
221
+ verify_reg_token = response["regToken"]
222
+ response = conn.api_get("accounts", "finalizeRegistration", {"regToken" => verify_reg_token, "include" => "emails, profile"}, :debug_connection => opts[:debug])
223
+ unless response["errorCode"] == 0 || response["errorCode"] == 206002 || response["errorCode"] == 206001
224
+ raise "Unable to finalize registration"
225
+ end
226
+ end
227
+ end
228
+
229
+ if opts[:send_verification]
230
+ conn.api_get("accounts", "resendVerificationCode", {"UID" => new_uid, "email" => email})
231
+ end
232
+
233
+ if opts[:send_password_change]
234
+ conn.api_get("accounts", "resetPassword", {"UID" => new_uid, "loginID" => email, "email" => email})
235
+ end
236
+
237
+ return new_uid
238
+ end
239
+
240
+ # Creates a gigya user through the `register` pathway
241
+
242
+ # Options:
243
+ # :password => Set a password,
244
+ # :source => the registration source
245
+ # :account => hash of any account defaults you want to set. Profile defaults should be under the "profile" key.
246
+ # :debug => will print out call information
247
+
248
+ def self.create_gigya_user_through_register(email, opts = {})
249
+ conn = opts[:gigya_connection] || Gigya::Connection.shared_connection
250
+
251
+ new_password = opts[:password] || SecureRandom.urlsafe_base64(8)
252
+
253
+ # Create UUID
254
+ new_uid = opts[:UID] || "#{SecureRandom.uuid.gsub("-", "")}#{SecureRandom.uuid.gsub("-", "")}"
255
+
256
+ # Is the address available?
257
+ email_is_available = conn.api_get("accounts", "isAvailableLoginID", { "loginID" => email }, :debug_connection => opts[:debug])["isAvailable"] rescue false
258
+ raise "Username is unavailable" unless email_is_available
259
+
260
+ # Start the registration process
261
+ regtoken = conn.api_get("accounts", "initRegistration", {}, :debug_connection => opts[:debug])["regToken"] rescue nil
262
+ raise "Could not initiate registration" if regtoken.blank?
263
+
264
+ # Create the data record
265
+ account_info = opts[:account] || {} # This allows the caller to send us defaults
266
+ account_info["siteUID"] = new_uid # Primary key
267
+ account_info["regToken"] = regtoken # Ties it to the initial registration
268
+ account_info["profile"] ||= {}
269
+ account_info["email"] = email
270
+ account_info["profile"]["email"] = email # Actual login username
271
+ account_info["profile"] = account_info["profile"].to_json
272
+ account_info["preferences"] = account_info["preferences"].to_json unless account_info["preferences"].nil?
273
+ account_info["regSource"] = opts[:source] unless opts[:source].blank?
274
+ account_info["password"] = new_password
275
+ account_info["data"] = account_info["data"].to_json unless account_info["data"].nil?
276
+
277
+ # Complete the registration process
278
+ conn.api_post("accounts", "register", account_info, :debug_connection => opts[:debug])
279
+
280
+ if opts[:send_verification]
281
+ conn.api_get("accounts", "resendVerificationCode", {"UID" => new_uid, "email" => email})
282
+ end
283
+
284
+ if opts[:send_password_change]
285
+ conn.api_get("accounts", "resetPassword", {"UID" => new_uid, "loginID" => email, "email" => email})
286
+ end
287
+
288
+ return new_uid
289
+ end
290
+
291
+ private
292
+
293
+ def my_gigya_connection
294
+ gigya_connection || Gigya::Connection.shared_connection
295
+ end
166
296
  end
167
297
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nm-gigya
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20
4
+ version: 0.1.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Bartlett
8
8
  - Tyler Jackson
9
9
  - Clark Ritchie
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-02-07 00:00:00.000000000 Z
13
+ date: 2020-04-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -40,8 +40,8 @@ dependencies:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '2.1'
43
- description:
44
- email: jonathan@newmedio.com
43
+ description:
44
+ email: jonathan.bartlett@specialized.com
45
45
  executables: []
46
46
  extensions: []
47
47
  extra_rdoc_files: []
@@ -56,7 +56,7 @@ homepage: http://www.newmedio.com/
56
56
  licenses:
57
57
  - MIT
58
58
  metadata: {}
59
- post_install_message:
59
+ post_install_message:
60
60
  rdoc_options: []
61
61
  require_paths:
62
62
  - lib
@@ -71,8 +71,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
71
  - !ruby/object:Gem::Version
72
72
  version: '0'
73
73
  requirements: []
74
- rubygems_version: 3.0.2
75
- signing_key:
74
+ rubygems_version: 3.1.2
75
+ signing_key:
76
76
  specification_version: 4
77
77
  summary: Gigya API Utility Package
78
78
  test_files: []