login_radius 3.0.0 → 10.0.0.pre.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.txt +21 -0
  3. data/README.md +58 -52
  4. data/lib/login_radius.rb +30 -15
  5. data/lib/login_radius/api/account/account_api.rb +581 -0
  6. data/lib/login_radius/api/account/role_api.rb +330 -0
  7. data/lib/login_radius/api/account/sott_api.rb +47 -0
  8. data/lib/login_radius/api/advanced/configuration_api.rb +57 -0
  9. data/lib/login_radius/api/advanced/consent_management_api.rb +161 -0
  10. data/lib/login_radius/api/advanced/custom_object_api.rb +316 -0
  11. data/lib/login_radius/api/advanced/custom_registration_data_api.rb +195 -0
  12. data/lib/login_radius/api/advanced/multi_factor_authentication_api.rb +606 -0
  13. data/lib/login_radius/api/advanced/re_authentication_api.rb +243 -0
  14. data/lib/login_radius/api/advanced/web_hook_api.rb +101 -0
  15. data/lib/login_radius/api/authentication/authentication_api.rb +986 -0
  16. data/lib/login_radius/api/authentication/one_touch_login_api.rb +160 -0
  17. data/lib/login_radius/api/authentication/password_less_login_api.rb +158 -0
  18. data/lib/login_radius/api/authentication/phone_authentication_api.rb +329 -0
  19. data/lib/login_radius/api/authentication/pin_authentication_api.rb +316 -0
  20. data/lib/login_radius/api/authentication/risk_based_authentication_api.rb +286 -0
  21. data/lib/login_radius/api/authentication/smart_login_api.rb +146 -0
  22. data/lib/login_radius/api/social/native_social_api.rb +193 -0
  23. data/lib/login_radius/api/social/social_api.rb +802 -0
  24. data/lib/login_radius/error.rb +7 -0
  25. data/lib/login_radius/request_client.rb +295 -0
  26. data/lib/login_radius/response.rb +12 -0
  27. data/lib/login_radius/version.rb +3 -3
  28. data/login_radius.gemspec +36 -0
  29. metadata +61 -20
  30. data/LICENSE +0 -22
  31. data/lib/hash.rb +0 -12
  32. data/lib/login_radius/advanced_api.rb +0 -133
  33. data/lib/login_radius/authentication_api.rb +0 -597
  34. data/lib/login_radius/exception.rb +0 -4
  35. data/lib/login_radius/management_api.rb +0 -327
  36. data/lib/login_radius/rest_request.rb +0 -142
  37. data/lib/login_radius/social_api.rb +0 -402
  38. data/lib/login_radius/two_fa_api.rb +0 -191
  39. data/lib/string.rb +0 -8
@@ -0,0 +1,7 @@
1
+ module LoginRadius
2
+ class Error < StandardError
3
+ def initialize(msg = 'An error occurred.')
4
+ super(msg)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,295 @@
1
+ require 'net/http'
2
+ require 'openssl'
3
+ require 'base64'
4
+ require 'cgi'
5
+
6
+ module LoginRadius
7
+ module RequestClient
8
+ # LoginRadius Client Module: Methods relating to building and sending requests are defined here.
9
+
10
+ API_V2_BASE_URL = 'https://api.loginradius.com/'
11
+ API_V2_BASE_URL_CONFIG = 'https://config.lrcontent.com/'
12
+ INIT_VECTOR = 'tu89geji340t89u2'
13
+ KEY_SIZE = 256
14
+
15
+ # Sends a POST API request.
16
+ #
17
+ # @param uri_endpoint [URI] Target uri instance
18
+ # @param params [Hash] Parameters to send
19
+ # @param body [Hash] POST body
20
+ #
21
+ # @return [LoginRadius::Response] LoginRadius response instance
22
+ def post_request(uri_endpoint, params, body = {})
23
+ uri_obj = build_new_uri_obj(uri_endpoint)
24
+
25
+ headers = { 'Content-Type' => 'application/json' }
26
+ if params.key?('access_token') # has_key
27
+ if uri_endpoint.include? 'auth'
28
+ access_token = params['access_token']
29
+ params.delete('access_token')
30
+ headers['Authorization'] = 'Bearer ' + access_token
31
+ end
32
+ end
33
+
34
+ if params.key?('apiSecret') # has_key
35
+ secret_key = params['apiSecret']
36
+ params.delete('apiSecret')
37
+
38
+ if ENV['API_REQUEST_SIGNING'] == 'false' || ENV['API_REQUEST_SIGNING'] == nil
39
+ headers['X-LoginRadius-ApiSecret'] = secret_key
40
+ else
41
+ uri_obj = build_new_uri_obj(uri_endpoint)
42
+ uri_obj.query = URI.encode_www_form(params)
43
+ headers = create_hash_secret(uri_obj.request_uri, secret_key, headers, body)
44
+ end
45
+ end
46
+ if params.key?('sott') # has_key
47
+ headers['X-LoginRadius-Sott'] = params['sott']
48
+ params.delete('sott')
49
+ end
50
+
51
+ uri_obj.query = URI.encode_www_form(params)
52
+ http = Net::HTTP.new(uri_obj.host, uri_obj.port)
53
+ http.use_ssl = true
54
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
55
+
56
+ response = http.post(uri_obj.request_uri, body.to_json, headers)
57
+
58
+ begin
59
+ return LoginRadius::Response.new(response)
60
+ rescue JSON::ParserError => e
61
+ raise LoginRadius::Error.new("JSON parsing error has occurred. More info: #{e.message}")
62
+ end
63
+ end
64
+
65
+ def isNullOrWhiteSpace(params)
66
+ return params.blank? ? true : false
67
+ end
68
+
69
+ def getValidationMessage(params)
70
+ return params + " is a required parameter."
71
+ end
72
+
73
+ # Sends a GET API request.
74
+ #
75
+ # @param uri_endpoint [URI] Target uri instance
76
+ # @param params [Hash] Parameters to send
77
+ # @param body [Hash] Request body
78
+ #
79
+ # @return [LoginRadius::Response] LoginRadius response instance
80
+ def get_request(uri_endpoint, params, body = {})
81
+ uri_obj = build_new_uri_obj(uri_endpoint)
82
+
83
+ headers = {'Content-Type' => 'application/json'}
84
+ if params.key?('access_token') # has_key
85
+ if uri_endpoint.include? 'auth'
86
+ access_token = params['access_token']
87
+ params.delete('access_token')
88
+ headers['Authorization'] = 'Bearer ' + access_token
89
+ end
90
+ end
91
+
92
+ if params.key?('apiSecret') # has_key
93
+ secret_key = params['apiSecret']
94
+ params.delete('apiSecret')
95
+
96
+ if ENV['API_REQUEST_SIGNING'] == 'false' || ENV['API_REQUEST_SIGNING'] == nil
97
+ headers['X-LoginRadius-ApiSecret'] = secret_key
98
+ else
99
+ uri_obj = build_new_uri_obj(uri_endpoint)
100
+ uri_obj.query = URI.encode_www_form(params)
101
+ headers = create_hash_secret(uri_obj.request_uri, secret_key, headers, body)
102
+ end
103
+ end
104
+ if params.key?('sott') # has_key
105
+ headers['X-LoginRadius-Sott'] = params['sott']
106
+ params.delete('sott')
107
+ end
108
+
109
+ uri_obj.query = URI.encode_www_form(params)
110
+ http = Net::HTTP.new(uri_obj.host, uri_obj.port)
111
+ http.use_ssl = true
112
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
113
+ response = http.get(uri_obj.request_uri, headers)
114
+
115
+ begin
116
+ return LoginRadius::Response.new(response)
117
+ rescue JSON::ParserError => e
118
+ raise LoginRadius::Error.new("JSON parsing error has occurred. More info: #{e.message}")
119
+ end
120
+ end
121
+
122
+ # Sends a PUT API request.
123
+ #
124
+ # @param uri_endpoint [URI] Target uri instance
125
+ # @param params [Hash] Parameters to send
126
+ # @param body [Hash] PUT body
127
+ #
128
+ # @return [LoginRadius::Response] LoginRadius response instance
129
+ def put_request(uri_endpoint, params, body = {})
130
+ uri_obj = build_new_uri_obj(uri_endpoint)
131
+
132
+ headers = { 'Content-Type' => 'application/json' }
133
+ if params.key?('access_token') # has_key
134
+ if uri_endpoint.include? 'auth'
135
+ access_token = params['access_token']
136
+ params.delete('access_token')
137
+ headers['Authorization'] = 'Bearer ' + access_token
138
+ end
139
+ end
140
+
141
+ if params.key?('apiSecret') # has_key
142
+ secret_key = params['apiSecret']
143
+ params.delete('apiSecret')
144
+
145
+ if ENV['API_REQUEST_SIGNING'] == 'false' || ENV['API_REQUEST_SIGNING'] == nil
146
+ headers['X-LoginRadius-ApiSecret'] = secret_key
147
+ else
148
+ uri_obj = build_new_uri_obj(uri_endpoint)
149
+ uri_obj.query = URI.encode_www_form(params)
150
+
151
+ headers = create_hash_secret(uri_obj.request_uri, secret_key, headers, body)
152
+ end
153
+ end
154
+ if params.key?('sott') # has_key
155
+ headers['X-LoginRadius-Sott'] = params['sott']
156
+ params.delete('sott')
157
+ end
158
+
159
+ uri_obj.query = URI.encode_www_form(params)
160
+ http = Net::HTTP.new(uri_obj.host, uri_obj.port)
161
+ http.use_ssl = true
162
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
163
+ response = http.put(uri_obj.request_uri, body.to_json, headers)
164
+ begin
165
+ return LoginRadius::Response.new(response)
166
+ rescue JSON::ParserError => e
167
+ raise LoginRadius::Error.new("JSON parsing error has occurred. More info: #{e.message}")
168
+ end
169
+ end
170
+
171
+ # Sends a DELETE API request.
172
+ #
173
+ # @param uri_endpoint [URI] Target uri instance
174
+ # @param params [Hash] Parameters to send
175
+ # @param body [Hash] POST body
176
+ #
177
+ # @return [LoginRadius::Response] LoginRadius response instance
178
+ def delete_request(uri_endpoint, params, body = {})
179
+ uri_obj = build_new_uri_obj(uri_endpoint)
180
+
181
+ headers = { 'Content-Type' => 'application/json' }
182
+ if params.key?('access_token') # has_key
183
+ if uri_endpoint.include? 'auth'
184
+ access_token = params['access_token']
185
+ params.delete('access_token')
186
+ headers['Authorization'] = 'Bearer ' + access_token
187
+ end
188
+ end
189
+
190
+ if params.key?('apiSecret') # has_key
191
+ secret_key = params['apiSecret']
192
+ params.delete('apiSecret')
193
+
194
+ if ENV['API_REQUEST_SIGNING'] == 'false' || ENV['API_REQUEST_SIGNING'] == nil
195
+ headers['X-LoginRadius-ApiSecret'] = secret_key
196
+ else
197
+ uri_obj = build_new_uri_obj(uri_endpoint)
198
+ uri_obj.query = URI.encode_www_form(params)
199
+ headers = create_hash_secret(uri_obj.request_uri, secret_key, headers, body)
200
+ end
201
+ end
202
+ if params.key?('sott') # has_key
203
+ headers['X-LoginRadius-Sott'] = params['sott']
204
+ params.delete('sott')
205
+ end
206
+
207
+ uri_obj.query = URI.encode_www_form(params)
208
+ http = Net::HTTP.new(uri_obj.host, uri_obj.port)
209
+ http.use_ssl = true
210
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
211
+ req = Net::HTTP::Delete.new(uri_obj.request_uri, headers)
212
+ req.body = body.to_json
213
+ response = http.request(req)
214
+
215
+ begin
216
+ return LoginRadius::Response.new(response)
217
+ rescue JSON::ParserError => e
218
+ raise LoginRadius::Error.new("JSON parsing error has occurred. More info: #{e.message}")
219
+ end
220
+ end
221
+
222
+ # Builds a URI instance given type and resource
223
+ #
224
+ # @param resource [String] Target resource
225
+ # custom_api_domain is set
226
+ # @return [URI] uri instance
227
+ def build_new_uri_obj(resource)
228
+ if resource == 'ciam/appinfo'
229
+ return URI.parse(API_V2_BASE_URL_CONFIG + resource)
230
+ else
231
+ if ENV['CUSTOM_API_DOMAIN'] == 'false' || ENV['CUSTOM_API_DOMAIN'] == nil
232
+ return URI.parse(API_V2_BASE_URL + resource)
233
+ else
234
+ return URI.parse(ENV['CUSTOM_API_DOMAIN'] + resource)
235
+ end
236
+ end
237
+ end
238
+
239
+ # Create a has digest in header
240
+ #
241
+ # @param endpoint [String] endpoint
242
+ # @param secret_key [String] secret key
243
+ # @param headers [String] headers
244
+ # @param body [String] body
245
+ # @return [URI] uri instance
246
+ #
247
+ # @return [headers] header
248
+ def create_hash_secret(endpoint, secret_key, headers, body = {})
249
+ endpoint_uri = 'https://api.loginradius.com' + endpoint
250
+ expiry_time = (Time.now.getutc() + (1*60*60)).strftime('%Y/%m/%d %H:%M:%S')
251
+
252
+ encoded_uri = CGI.escape(CGI.unescape(endpoint_uri))
253
+
254
+ if body.blank?
255
+ string_to_hash = expiry_time + ':' + encoded_uri.downcase
256
+ else
257
+ string_to_hash = expiry_time + ':' + encoded_uri.downcase + ':' + body.to_json
258
+ end
259
+
260
+ mac = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), secret_key, string_to_hash)).strip()
261
+ headers['X-Request-Expires'] = expiry_time
262
+ headers['digest'] = 'SHA-256='+mac
263
+ return headers
264
+ end
265
+
266
+ # Local - Generate SOTT:
267
+ # Generates a Secured One Time Token locally.
268
+ #
269
+ # @params validity_length [Integer] Length of time the SOTT is valid for in minutes
270
+ #
271
+ # @returns sott [String] LoginRadius Secured One Time Token
272
+ def local_generate_sott(validity_length = 10)
273
+ start_time = Time.now.getutc().strftime('%Y/%m/%d %H:%M:%S')
274
+ end_time = (Time.now.getutc() + (validity_length*60)).strftime('%Y/%m/%d %H:%M:%S')
275
+
276
+ plain_text = start_time + '#' + ENV['API_KEY'] + '#' + end_time
277
+ iter = 10000
278
+ salt = "\x00\x00\x00\x00\x00\x00\x00\x00"
279
+ key_len = KEY_SIZE / 8
280
+ cipher_key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(ENV['API_SECRET'], salt, iter, key_len)
281
+
282
+ cipher = OpenSSL::Cipher.new('aes-' + KEY_SIZE.to_s + '-cbc')
283
+ cipher.encrypt
284
+ cipher.key = cipher_key
285
+ cipher.iv = INIT_VECTOR
286
+
287
+ encrypted = cipher.update(plain_text) + cipher.final
288
+ encrypted_b64 = Base64.strict_encode64(encrypted)
289
+
290
+ hash = Digest::MD5.hexdigest(encrypted_b64)
291
+ sott = encrypted_b64 + '*' + hash
292
+ return sott
293
+ end
294
+ end
295
+ end
@@ -0,0 +1,12 @@
1
+ module LoginRadius
2
+ class Response
3
+ # LoginRadius Response Class: Defines the data response object returned from an API call.
4
+
5
+ attr_accessor :code, :body
6
+
7
+ def initialize(response)
8
+ self.code = response.code
9
+ self.body = JSON.parse(response.body, :symbolize_names => true)
10
+ end
11
+ end
12
+ end
@@ -1,3 +1,3 @@
1
- module LoginRadius
2
- VERSION = "3.0.0"
3
- end
1
+ module LoginRadius
2
+ VERSION = "10.0.0-beta"
3
+ end
@@ -0,0 +1,36 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "login_radius/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "login_radius"
8
+ spec.version = LoginRadius::VERSION
9
+ spec.authors = ["LoginRadius"]
10
+ spec.email = ["developers@loginradius.com"]
11
+
12
+ spec.summary = %q{A Ruby wrapper for the LoginRadius API.}
13
+ spec.homepage = "https://www.loginradius.com"
14
+ spec.license = "MIT"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ # if spec.respond_to?(:metadata)
19
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
20
+ # else
21
+ # raise "RubyGems 2.0 or newer is required to protect against " \
22
+ # "public gem pushes."
23
+ # end
24
+
25
+ # Specify which files should be added to the gem when it is released.
26
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
28
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
+ end
30
+ spec.bindir = "exe"
31
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
+ spec.require_paths = ["lib"]
33
+
34
+ spec.add_development_dependency "bundler", "~> 1.16"
35
+ spec.add_development_dependency "rake", "~> 10.0"
36
+ end
metadata CHANGED
@@ -1,35 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: login_radius
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 10.0.0.pre.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - LoginRadius
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-03 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Ruby wrapper for LoginRadius API
11
+ date: 2019-12-12 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.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
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
+ description:
14
42
  email:
15
43
  - developers@loginradius.com
16
44
  executables: []
17
45
  extensions: []
18
46
  extra_rdoc_files: []
19
47
  files:
20
- - LICENSE
48
+ - LICENSE.txt
21
49
  - README.md
22
- - lib/hash.rb
23
50
  - lib/login_radius.rb
24
- - lib/login_radius/advanced_api.rb
25
- - lib/login_radius/authentication_api.rb
26
- - lib/login_radius/exception.rb
27
- - lib/login_radius/management_api.rb
28
- - lib/login_radius/rest_request.rb
29
- - lib/login_radius/social_api.rb
30
- - lib/login_radius/two_fa_api.rb
51
+ - lib/login_radius/api/account/account_api.rb
52
+ - lib/login_radius/api/account/role_api.rb
53
+ - lib/login_radius/api/account/sott_api.rb
54
+ - lib/login_radius/api/advanced/configuration_api.rb
55
+ - lib/login_radius/api/advanced/consent_management_api.rb
56
+ - lib/login_radius/api/advanced/custom_object_api.rb
57
+ - lib/login_radius/api/advanced/custom_registration_data_api.rb
58
+ - lib/login_radius/api/advanced/multi_factor_authentication_api.rb
59
+ - lib/login_radius/api/advanced/re_authentication_api.rb
60
+ - lib/login_radius/api/advanced/web_hook_api.rb
61
+ - lib/login_radius/api/authentication/authentication_api.rb
62
+ - lib/login_radius/api/authentication/one_touch_login_api.rb
63
+ - lib/login_radius/api/authentication/password_less_login_api.rb
64
+ - lib/login_radius/api/authentication/phone_authentication_api.rb
65
+ - lib/login_radius/api/authentication/pin_authentication_api.rb
66
+ - lib/login_radius/api/authentication/risk_based_authentication_api.rb
67
+ - lib/login_radius/api/authentication/smart_login_api.rb
68
+ - lib/login_radius/api/social/native_social_api.rb
69
+ - lib/login_radius/api/social/social_api.rb
70
+ - lib/login_radius/error.rb
71
+ - lib/login_radius/request_client.rb
72
+ - lib/login_radius/response.rb
31
73
  - lib/login_radius/version.rb
32
- - lib/string.rb
74
+ - login_radius.gemspec
33
75
  homepage: https://www.loginradius.com
34
76
  licenses:
35
77
  - MIT
@@ -45,13 +87,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
45
87
  version: '0'
46
88
  required_rubygems_version: !ruby/object:Gem::Requirement
47
89
  requirements:
48
- - - ">="
90
+ - - ">"
49
91
  - !ruby/object:Gem::Version
50
- version: '0'
92
+ version: 1.3.1
51
93
  requirements: []
52
- rubyforge_project:
53
- rubygems_version: 2.6.13
94
+ rubygems_version: 3.0.3
54
95
  signing_key:
55
96
  specification_version: 4
56
- summary: Is a ruby wrapper for LoginRadius API
97
+ summary: A Ruby wrapper for the LoginRadius API.
57
98
  test_files: []