onelogin 1.0.1 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -18
- data/examples/Gemfile +3 -0
- data/examples/Gemfile.lock +21 -0
- data/examples/README.md +19 -0
- data/examples/all-users-to-csv.rb +47 -0
- data/examples/create-user.rb +16 -0
- data/examples/events-to-csv.rb +77 -0
- data/examples/list-users.rb +15 -0
- data/lib/onelogin/api/client.rb +263 -5
- data/lib/onelogin/api/models/auth_factor.rb +16 -0
- data/lib/onelogin/api/models/factor_enrollment_response.rb +22 -0
- data/lib/onelogin/api/models/otp_device.rb +25 -0
- data/lib/onelogin/api/models/user.rb +7 -4
- data/lib/onelogin/api/models/user_data.rb +1 -1
- data/lib/onelogin/api/models.rb +3 -0
- data/lib/onelogin/api/util/constants.rb +7 -0
- data/lib/onelogin/api/util/url_builder.rb +5 -2
- data/lib/onelogin/version.rb +2 -2
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a853d4babb81062c1848521170d52d214790795
|
4
|
+
data.tar.gz: b05724bd5d05456367fc6156a1a142e1520a1dc4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0d58e6cd9c59d3dc9c532c48884c316a1e14f5f59f6524de078c4caea08df37c5a9e92d194250846316f72a520c1ac579d95d9ca208b1a12a7f4937d9875ca5
|
7
|
+
data.tar.gz: 2f6ac6069d8ca15c0f705c103be55f50dd2258fdc8a381a64557fd7b1a08f91906ea87e2321d8035cd4eca752fcc78fa1e6c513f2102ab10541ac38ad5884268
|
data/README.md
CHANGED
@@ -238,24 +238,6 @@ created_user = client.create_user(new_user_params)
|
|
238
238
|
# Delete User
|
239
239
|
result = client.delete_user(created_user.id)
|
240
240
|
|
241
|
-
# Create Session Login Token
|
242
|
-
session_login_token_params = {
|
243
|
-
username_or_email: "user@example.com",
|
244
|
-
password: "Aa765431-XxX",
|
245
|
-
subdomain: "example-onelogin-subdomain"
|
246
|
-
}
|
247
|
-
session_token_data = client.create_session_login_token(session_login_token_params)
|
248
|
-
|
249
|
-
# Create Session Login Token MFA , after verify
|
250
|
-
session_login_token_mfa_params = {
|
251
|
-
username_or_email: "usermfa@example.com",
|
252
|
-
password: "Aa765432-YyY",
|
253
|
-
subdomain: "example-onelogin-subdomain"
|
254
|
-
}
|
255
|
-
session_token_mfa_data = client.create_session_login_token(session_login_token_mfa_params)
|
256
|
-
otp_token = "000000" # We get this value from OTP device
|
257
|
-
session_token_data2 = client.get_session_token_verified(session_token_mfa_data.devices[0].id,session_token_mfa_data.state_token, otp_token)
|
258
|
-
|
259
241
|
# Get EventTypes
|
260
242
|
event_types = client.get_event_types
|
261
243
|
|
@@ -303,6 +285,44 @@ mfa = saml_endpoint_response2.mfa
|
|
303
285
|
otp_token = "000000"
|
304
286
|
saml_endpoint_response_after_verify = client.get_saml_assertion_verifying(app_id, mfa.devices[0].id, mfa.state_token, "78395727", nil)
|
305
287
|
|
288
|
+
# Create Session Login Token
|
289
|
+
session_login_token_params = {
|
290
|
+
username_or_email: "user@example.com",
|
291
|
+
password: "Aa765431-XxX",
|
292
|
+
subdomain: "example-onelogin-subdomain"
|
293
|
+
}
|
294
|
+
session_token_data = client.create_session_login_token(session_login_token_params)
|
295
|
+
|
296
|
+
# Create Session Via API Token
|
297
|
+
cookie = client..create_session_via_token(session_token_data.session_token)
|
298
|
+
|
299
|
+
# Create Session Login Token MFA , after verify
|
300
|
+
session_login_token_mfa_params = {
|
301
|
+
username_or_email: "usermfa@example.com",
|
302
|
+
password: "Aa765432-YyY",
|
303
|
+
subdomain: "example-onelogin-subdomain"
|
304
|
+
}
|
305
|
+
session_token_mfa_data = client.create_session_login_token(session_login_token_mfa_params)
|
306
|
+
otp_token = "000000" # We get this value from OTP device
|
307
|
+
session_token_data2 = client.get_session_token_verified(session_token_mfa_data.devices.first.id,session_token_mfa_data.state_token, otp_token)
|
308
|
+
|
309
|
+
user_id = 00000000
|
310
|
+
# Get Available Authentication Factors
|
311
|
+
auth_factors = client.get_factors(user_id)
|
312
|
+
|
313
|
+
# Enroll an Authentication Factor
|
314
|
+
enroll_factor = client.enroll_factor(user_id, auth_factors.first.id, 'My Device', '+14156456830')
|
315
|
+
|
316
|
+
# Get Enrolled Authentication Factors
|
317
|
+
otp_devices = client.get_enrolled_factors(user_id)
|
318
|
+
|
319
|
+
# Activate an Authentication Factor
|
320
|
+
device_id = 0000000
|
321
|
+
enrollment_response = client.activate_factor(user_id, device_id)
|
322
|
+
|
323
|
+
# Verify an Authentication Factor
|
324
|
+
result = client.verify_factor(user_id, device_id, otp_token="4242342423")
|
325
|
+
|
306
326
|
# Generate Invite Link
|
307
327
|
url_link = client.generate_invite_link("user@example.com")
|
308
328
|
|
data/examples/Gemfile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
httparty (0.16.0)
|
5
|
+
multi_xml (>= 0.5.2)
|
6
|
+
mini_portile2 (2.3.0)
|
7
|
+
multi_xml (0.6.0)
|
8
|
+
nokogiri (1.8.2)
|
9
|
+
mini_portile2 (~> 2.3.0)
|
10
|
+
onelogin (1.0.1)
|
11
|
+
httparty (>= 0.13.7)
|
12
|
+
nokogiri (>= 1.6.3.1)
|
13
|
+
|
14
|
+
PLATFORMS
|
15
|
+
ruby
|
16
|
+
|
17
|
+
DEPENDENCIES
|
18
|
+
onelogin
|
19
|
+
|
20
|
+
BUNDLED WITH
|
21
|
+
1.16.0.pre.3
|
data/examples/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Ruby SDK Examples
|
2
|
+
|
3
|
+
This folder contains various samples that make use of the OneLogin
|
4
|
+
Ruby SDK.
|
5
|
+
|
6
|
+
It assumes that you have a valid OneLogin `client_id` and `client_secret`
|
7
|
+
with the appropriate level of access for each example.
|
8
|
+
|
9
|
+
## Try the examples in terminal
|
10
|
+
|
11
|
+
First install the OneLogin gem and any other required gems
|
12
|
+
```shell
|
13
|
+
bundle install
|
14
|
+
```
|
15
|
+
|
16
|
+
Then update your API credentials in the example file and run it
|
17
|
+
```shell
|
18
|
+
ruby create-user.rb
|
19
|
+
```
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'onelogin'
|
2
|
+
|
3
|
+
#
|
4
|
+
# This example shows how you can export user details from OneLogin using the Ruby SDK
|
5
|
+
#
|
6
|
+
# Usage:
|
7
|
+
# 1. Set your own CLIENT_ID and CLIENT_SECRET below
|
8
|
+
# 2. From terminal run "ruby all-users-to-csv.rb" to extract all users including
|
9
|
+
# any custom attributes that might have been defined for the each user
|
10
|
+
#
|
11
|
+
|
12
|
+
client = OneLogin::Api::Client.new(
|
13
|
+
client_id: 'ONELOGIN_CLIENT_ID',
|
14
|
+
client_secret:'ONELOGIN_CLIENT_SECRET',
|
15
|
+
region: 'us'
|
16
|
+
)
|
17
|
+
|
18
|
+
attribute_names = ['id', 'external_id', 'email', 'username', 'firstname', 'lastname', 'distinguished_name',
|
19
|
+
'phone', 'company', 'department', 'status', 'member_of', 'samaccountname', 'userprincipalname',
|
20
|
+
'group_id', 'role_ids', 'custom_attributes', 'openid_name', 'locale_code', 'comment', 'directory_id',
|
21
|
+
'manager_ad_id', 'trusted_idp_id', 'activated_at', 'created_at', 'updated_at',
|
22
|
+
'password_changed_at', 'invitation_sent_at', 'invalid_login_attempts', 'last_login', 'locked_until']
|
23
|
+
|
24
|
+
custom_attribute_names = client.get_custom_attributes
|
25
|
+
|
26
|
+
CSV.open('users.csv', 'wb') do |csv|
|
27
|
+
# header row
|
28
|
+
csv << attribute_names + custom_attribute_names
|
29
|
+
|
30
|
+
client.get_users.each do |user|
|
31
|
+
|
32
|
+
row = []
|
33
|
+
|
34
|
+
# standard attributes
|
35
|
+
attribute_names.each do |attribute_name|
|
36
|
+
row << user.send(attribute_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
# custom attributes
|
40
|
+
custom_attribute_names.each do |attribute_name|
|
41
|
+
row << user.custom_attributes[attribute_name] unless user.custom_attributes.empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
csv << row
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'onelogin'
|
2
|
+
|
3
|
+
client = OneLogin::Api::Client.new(
|
4
|
+
client_id: 'ONELOGIN_CLIENT_ID',
|
5
|
+
client_secret:'ONELOGIN_CLIENT_SECRET',
|
6
|
+
region: 'us'
|
7
|
+
)
|
8
|
+
|
9
|
+
user = client.create_user(
|
10
|
+
firstname: "Mick",
|
11
|
+
lastname: "Fanning",
|
12
|
+
email: "mick@onelogin.com",
|
13
|
+
username: "mick"
|
14
|
+
)
|
15
|
+
|
16
|
+
puts user
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'onelogin'
|
2
|
+
require 'optparse'
|
3
|
+
require 'optparse/time'
|
4
|
+
|
5
|
+
#
|
6
|
+
# This example shows how you can export events from OneLogin using the Ruby SDK
|
7
|
+
#
|
8
|
+
# Usage:
|
9
|
+
# 1. Set your own CLIENT_ID and CLIENT_SECRET below
|
10
|
+
# 2. From terminal run "ruby events-to-csv.rb" for the last 1000 events
|
11
|
+
# 3. Use the command line args to filter events
|
12
|
+
#
|
13
|
+
# e.g. "ruby events-to-csv.rb -t 5 -s 2018-01-01" for login events since Jan 1 2018
|
14
|
+
#
|
15
|
+
|
16
|
+
|
17
|
+
# Parse CLI arguments
|
18
|
+
options = {}
|
19
|
+
|
20
|
+
OptionParser.new do |opts|
|
21
|
+
opts.banner = "Usage: events-to-csv.rb [options]"
|
22
|
+
|
23
|
+
opts.on("-sSINCE", "--since=SINCE", Time, "Events after this date") do |s|
|
24
|
+
options[:since] = s.iso8601
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on("-uUNTIL", "--UNTIL=UNTIL", Time, "Events before this date") do |u|
|
28
|
+
options[:until] = u.iso8601
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-lLIMIT", "--limit=LIMIT", Integer, "Only return this many events, Default 1000") do |l|
|
32
|
+
options[:limit] = l
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("-tTYPE", "--type=TYPE", Integer, "Filter by event type id") do |t|
|
36
|
+
options[:event_type_id] = t
|
37
|
+
end
|
38
|
+
end.parse!
|
39
|
+
|
40
|
+
# Fetch the events
|
41
|
+
client = OneLogin::Api::Client.new(
|
42
|
+
client_id: 'ONELOGIN_CLIENT_ID',
|
43
|
+
client_secret: 'ONELOGIN_CLIENT_SECRET',
|
44
|
+
region: 'us'
|
45
|
+
)
|
46
|
+
|
47
|
+
attribute_names = ['id', 'created_at', 'account_id', 'user_id', 'user_name', 'event_type_id',
|
48
|
+
'notes', 'ipaddr', 'actor_user_id', 'actor_user_name', 'assuming_acting_user_id',
|
49
|
+
'role_id', 'role_name', 'app_id', 'group_id', 'group_name', 'otp_device_id',
|
50
|
+
'otp_device_name', 'policy_id', 'policy_name', 'actor_system', 'custom_message',
|
51
|
+
'operation_name', 'directory_sync_run_id', 'directory_id', 'resolution', 'client_id',
|
52
|
+
'resource_type_id', 'error_description']
|
53
|
+
|
54
|
+
counter = 0
|
55
|
+
limit = options[:limit] || 1000
|
56
|
+
|
57
|
+
# We remove limit from options parsed to the api as we want to fetch
|
58
|
+
# the max number of records possible and then use the cursor that is
|
59
|
+
# built into the ruby sdk to limit the results
|
60
|
+
options.delete(:limit)
|
61
|
+
|
62
|
+
CSV.open('events.csv', 'wb') do |csv|
|
63
|
+
puts "Exporting events to events.csv"
|
64
|
+
|
65
|
+
# header row
|
66
|
+
csv << attribute_names
|
67
|
+
|
68
|
+
# fetch the events
|
69
|
+
client.get_events(options).take(limit).each do |event|
|
70
|
+
csv << attribute_names.map { |attribute_name| event.send(attribute_name) }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
puts "Exported #{counter} events to events.csv"
|
75
|
+
|
76
|
+
|
77
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'onelogin'
|
2
|
+
|
3
|
+
client = OneLogin::Api::Client.new(
|
4
|
+
client_id: 'ONELOGIN_CLIENT_ID',
|
5
|
+
client_secret:'ONELOGIN_CLIENT_SECRET',
|
6
|
+
region: 'us'
|
7
|
+
)
|
8
|
+
|
9
|
+
# List all of the users in your account
|
10
|
+
# the sdk uses a cursor to keep requesting
|
11
|
+
# chunks of users as you loop through
|
12
|
+
|
13
|
+
client.get_users.each do |user|
|
14
|
+
puts "#{user.id} - #{user.firstname} - #{user.email}"
|
15
|
+
end
|
data/lib/onelogin/api/client.rb
CHANGED
@@ -900,17 +900,13 @@ module OneLogin
|
|
900
900
|
begin
|
901
901
|
url = url_for(SESSION_LOGIN_TOKEN_URL)
|
902
902
|
|
903
|
-
unless allowed_origin.nil? || allowed_origin.empty?
|
904
|
-
headers['Custom-Allowed-Origin-Header-1'] = allowed_origin
|
905
|
-
end
|
906
|
-
|
907
903
|
if query_params.nil? || !query_params.has_key?('username_or_email') || !query_params.has_key?('password') || !query_params.has_key?('subdomain')
|
908
904
|
raise "username_or_email, password and subdomain are required parameters"
|
909
905
|
end
|
910
906
|
|
911
907
|
response = HTTParty.post(
|
912
908
|
url,
|
913
|
-
headers: authorized_headers,
|
909
|
+
headers: authorized_headers.merge({ 'Custom-Allowed-Origin-Header-1' => allowed_origin }),
|
914
910
|
body: query_params.to_json
|
915
911
|
)
|
916
912
|
|
@@ -973,6 +969,45 @@ module OneLogin
|
|
973
969
|
nil
|
974
970
|
end
|
975
971
|
|
972
|
+
# Post a session token to this API endpoint to start a session and set a cookie to log a user into an app.
|
973
|
+
#
|
974
|
+
# @param session_token [String] The session token
|
975
|
+
#
|
976
|
+
# @return [String] return the 'Set-Cookie' value of the HTTP Header if any
|
977
|
+
#
|
978
|
+
# @see {https://developers.onelogin.com/api-docs/1/login-page/create-session-via-token Create Session Via API Token documentation}
|
979
|
+
def create_session_via_token(session_token)
|
980
|
+
clean_error
|
981
|
+
|
982
|
+
begin
|
983
|
+
url = url_for(SESSION_API_TOKEN_URL)
|
984
|
+
|
985
|
+
data = {
|
986
|
+
'session_token'=> session_token
|
987
|
+
}
|
988
|
+
|
989
|
+
response = HTTParty.post(
|
990
|
+
url,
|
991
|
+
headers: headers,
|
992
|
+
body: data.to_json
|
993
|
+
)
|
994
|
+
|
995
|
+
if response.code == 200
|
996
|
+
if response.headers.key?('Set-Cookie')
|
997
|
+
return response.headers['Set-Cookie']
|
998
|
+
end
|
999
|
+
else
|
1000
|
+
@error = response.code.to_s
|
1001
|
+
@error_description = extract_error_message_from_response(response)
|
1002
|
+
end
|
1003
|
+
rescue Exception => e
|
1004
|
+
@error = '500'
|
1005
|
+
@error_description = e.message
|
1006
|
+
end
|
1007
|
+
|
1008
|
+
nil
|
1009
|
+
end
|
1010
|
+
|
976
1011
|
################
|
977
1012
|
# Role Methods #
|
978
1013
|
################
|
@@ -1350,6 +1385,229 @@ module OneLogin
|
|
1350
1385
|
nil
|
1351
1386
|
end
|
1352
1387
|
|
1388
|
+
#############################
|
1389
|
+
# Multi-factor Auth Methods #
|
1390
|
+
#############################
|
1391
|
+
|
1392
|
+
# Returns a list of authentication factors that are available for user enrollment via API.
|
1393
|
+
#
|
1394
|
+
# @param user_id [Integer] The id of the user.
|
1395
|
+
#
|
1396
|
+
# @return [Array] AuthFactor list
|
1397
|
+
#
|
1398
|
+
# @see {https://developers.onelogin.com/api-docs/1/multi-factor-authentication/available-factors Get Available Authentication Factors documentation}
|
1399
|
+
def get_factors(user_id)
|
1400
|
+
clean_error
|
1401
|
+
prepare_token
|
1402
|
+
|
1403
|
+
begin
|
1404
|
+
url = url_for(GET_FACTORS_URL, user_id)
|
1405
|
+
|
1406
|
+
response = HTTParty.get(
|
1407
|
+
url,
|
1408
|
+
:headers => authorized_headers
|
1409
|
+
)
|
1410
|
+
|
1411
|
+
factors = []
|
1412
|
+
if response.code == 200
|
1413
|
+
json_data = JSON.parse(response.body)
|
1414
|
+
if json_data and json_data['data'] and json_data['data']['auth_factors']
|
1415
|
+
json_data['data']['auth_factors'].each do |factor_data|
|
1416
|
+
factors << OneLogin::Api::Models::AuthFactor.new(factor_data)
|
1417
|
+
end
|
1418
|
+
end
|
1419
|
+
else
|
1420
|
+
@error = response.code.to_s
|
1421
|
+
@error_description = extract_error_message_from_response(response)
|
1422
|
+
end
|
1423
|
+
return factors
|
1424
|
+
rescue Exception => e
|
1425
|
+
@error = '500'
|
1426
|
+
@error_description = e.message
|
1427
|
+
end
|
1428
|
+
|
1429
|
+
nil
|
1430
|
+
end
|
1431
|
+
|
1432
|
+
# Enroll a user with a given authentication factor.
|
1433
|
+
#
|
1434
|
+
# @param user_id [Integer] The id of the user.
|
1435
|
+
# @param factor_id [Integer] The identifier of the factor to enroll the user with.
|
1436
|
+
# @param display_name [String] A name for the users device.
|
1437
|
+
# @param number [String] The phone number of the user in E.164 format.
|
1438
|
+
#
|
1439
|
+
# @return [OTPDevice] MFA device
|
1440
|
+
#
|
1441
|
+
# @see {https://developers.onelogin.com/api-docs/1/multi-factor-authentication/enroll-factor Enroll an Authentication Factor documentation}
|
1442
|
+
def enroll_factor(user_id, factor_id, display_name, number)
|
1443
|
+
clean_error
|
1444
|
+
prepare_token
|
1445
|
+
|
1446
|
+
begin
|
1447
|
+
url = url_for(ENROLL_FACTOR_URL, user_id)
|
1448
|
+
|
1449
|
+
data = {
|
1450
|
+
'factor_id'=> factor_id.to_i,
|
1451
|
+
'display_name'=> display_name,
|
1452
|
+
'number'=> number
|
1453
|
+
}
|
1454
|
+
|
1455
|
+
response = HTTParty.post(
|
1456
|
+
url,
|
1457
|
+
:headers => authorized_headers,
|
1458
|
+
body: data.to_json
|
1459
|
+
)
|
1460
|
+
|
1461
|
+
if response.code == 200
|
1462
|
+
json_data = JSON.parse(response.body)
|
1463
|
+
if json_data and json_data['data']
|
1464
|
+
return OneLogin::Api::Models::OTPDevice.new(json_data['data'][0])
|
1465
|
+
end
|
1466
|
+
else
|
1467
|
+
@error = response.code.to_s
|
1468
|
+
@error_description = extract_error_message_from_response(response)
|
1469
|
+
end
|
1470
|
+
rescue Exception => e
|
1471
|
+
@error = '500'
|
1472
|
+
@error_description = e.message
|
1473
|
+
end
|
1474
|
+
|
1475
|
+
nil
|
1476
|
+
end
|
1477
|
+
|
1478
|
+
# Return a list of authentication factors registered to a particular user for multifactor authentication (MFA)
|
1479
|
+
#
|
1480
|
+
# @param user_id [Integer] The id of the user.
|
1481
|
+
#
|
1482
|
+
# @return [Array] OTPDevice List
|
1483
|
+
#
|
1484
|
+
# @see {https://developers.onelogin.com/api-docs/1/multi-factor-authentication/enrolled-factors Get Enrolled Authentication Factors documentation}
|
1485
|
+
def get_enrolled_factors(user_id)
|
1486
|
+
clean_error
|
1487
|
+
prepare_token
|
1488
|
+
|
1489
|
+
begin
|
1490
|
+
url = url_for(GET_ENROLLED_FACTORS_URL, user_id)
|
1491
|
+
|
1492
|
+
response = HTTParty.get(
|
1493
|
+
url,
|
1494
|
+
:headers => authorized_headers
|
1495
|
+
)
|
1496
|
+
|
1497
|
+
otp_devices = []
|
1498
|
+
if response.code == 200
|
1499
|
+
json_data = JSON.parse(response.body)
|
1500
|
+
if json_data and json_data['data'] and json_data['data']['otp_devices']
|
1501
|
+
json_data['data']['otp_devices'].each do |otp_device_data|
|
1502
|
+
otp_devices << OneLogin::Api::Models::OTPDevice.new(otp_device_data)
|
1503
|
+
end
|
1504
|
+
end
|
1505
|
+
else
|
1506
|
+
@error = response.code.to_s
|
1507
|
+
@error_description = extract_error_message_from_response(response)
|
1508
|
+
end
|
1509
|
+
return otp_devices
|
1510
|
+
rescue Exception => e
|
1511
|
+
@error = '500'
|
1512
|
+
@error_description = e.message
|
1513
|
+
end
|
1514
|
+
|
1515
|
+
nil
|
1516
|
+
end
|
1517
|
+
|
1518
|
+
# Triggers an SMS or Push notification containing a One-Time Password (OTP)
|
1519
|
+
# that can be used to authenticate a user with the Verify Factor call.
|
1520
|
+
#
|
1521
|
+
# @param user_id [Integer] The id of the user.
|
1522
|
+
# @param device_id [Integer] The id of the MFA device.
|
1523
|
+
#
|
1524
|
+
# @return [FactorEnrollmentResponse] Info with User Id, Device Id, and OTP Device
|
1525
|
+
#
|
1526
|
+
# @see {https://developers.onelogin.com/api-docs/1/multi-factor-authentication/activate-factor Activate an Authentication Factor documentation}
|
1527
|
+
def activate_factor(user_id, device_id)
|
1528
|
+
clean_error
|
1529
|
+
prepare_token
|
1530
|
+
|
1531
|
+
begin
|
1532
|
+
url = url_for(ACTIVATE_FACTOR_URL, user_id, device_id)
|
1533
|
+
|
1534
|
+
response = HTTParty.post(
|
1535
|
+
url,
|
1536
|
+
headers: authorized_headers
|
1537
|
+
)
|
1538
|
+
|
1539
|
+
if response.code == 200
|
1540
|
+
json_data = JSON.parse(response.body)
|
1541
|
+
if json_data && json_data['data']
|
1542
|
+
return OneLogin::Api::Models::FactorEnrollmentResponse.new(json_data['data'][0])
|
1543
|
+
end
|
1544
|
+
else
|
1545
|
+
@error = response.code.to_s
|
1546
|
+
@error_description = extract_error_message_from_response(response)
|
1547
|
+
end
|
1548
|
+
rescue Exception => e
|
1549
|
+
@error = '500'
|
1550
|
+
@error_description = e.message
|
1551
|
+
end
|
1552
|
+
|
1553
|
+
nil
|
1554
|
+
end
|
1555
|
+
|
1556
|
+
# Authenticates a one-time password (OTP) code provided by a multifactor authentication (MFA) device.
|
1557
|
+
#
|
1558
|
+
# @param user_id [Integer] The id of the user.
|
1559
|
+
# @param device_id [Integer] The id of the MFA device.
|
1560
|
+
# @param otp_token [String] OTP code provided by the device or SMS message sent to user.
|
1561
|
+
# When a device like OneLogin Protect that supports Push has
|
1562
|
+
# been used you do not need to provide the otp_token.
|
1563
|
+
# @param state_token [String] The state_token is returned after a successful request
|
1564
|
+
# to Enroll a Factor or Activate a Factor.
|
1565
|
+
# MUST be provided if the needs_trigger attribute from
|
1566
|
+
# the proceeding calls is set to true.
|
1567
|
+
#
|
1568
|
+
# @return [Boolean] True if Factor is verified
|
1569
|
+
#
|
1570
|
+
# @see {https://developers.onelogin.com/api-docs/1/multi-factor-authentication/verify-factor Verify an Authentication Factor documentation}
|
1571
|
+
def verify_factor(user_id, device_id, otp_token=nil, state_token=nil)
|
1572
|
+
clean_error
|
1573
|
+
prepare_token
|
1574
|
+
|
1575
|
+
begin
|
1576
|
+
url = url_for(VERIFY_FACTOR_URL, user_id, device_id)
|
1577
|
+
|
1578
|
+
data = {
|
1579
|
+
'user_id'=> user_id,
|
1580
|
+
'device_id'=> device_id
|
1581
|
+
}
|
1582
|
+
|
1583
|
+
unless otp_token.nil? || otp_token.empty?
|
1584
|
+
data['otp_token'] = otp_token
|
1585
|
+
end
|
1586
|
+
|
1587
|
+
unless state_token.nil? || state_token.empty?
|
1588
|
+
data['state_token'] = state_token
|
1589
|
+
end
|
1590
|
+
|
1591
|
+
response = HTTParty.post(
|
1592
|
+
url,
|
1593
|
+
headers: authorized_headers,
|
1594
|
+
body: data.to_json
|
1595
|
+
)
|
1596
|
+
|
1597
|
+
if response.code == 200
|
1598
|
+
return handle_operation_response(response)
|
1599
|
+
else
|
1600
|
+
@error = response.code.to_s
|
1601
|
+
@error_description = extract_error_message_from_response(response)
|
1602
|
+
end
|
1603
|
+
rescue Exception => e
|
1604
|
+
@error = '500'
|
1605
|
+
@error_description = e.message
|
1606
|
+
end
|
1607
|
+
|
1608
|
+
false
|
1609
|
+
end
|
1610
|
+
|
1353
1611
|
########################
|
1354
1612
|
# Invite Links Methods #
|
1355
1613
|
########################
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module OneLogin
|
2
|
+
module Api
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class FactorEnrollmentResponse
|
6
|
+
|
7
|
+
attr_accessor :device_id, :user_id, :active, :auth_factor_name,
|
8
|
+
:type_display_name, :user_display_name, :state_token
|
9
|
+
|
10
|
+
def initialize(data)
|
11
|
+
@device_id = data['device_id']? data['device_id'].to_i : nil
|
12
|
+
@user_id = data['id']? data['id'].to_i : nil
|
13
|
+
@active = data['active']
|
14
|
+
@auth_factor_name = data['auth_factor_name']
|
15
|
+
@type_display_name = data['type_display_name']
|
16
|
+
@user_display_name = data['user_display_name']
|
17
|
+
@state_token = data['state_token']
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module OneLogin
|
2
|
+
module Api
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class OTPDevice
|
6
|
+
|
7
|
+
attr_accessor :id, :active, :default, :auth_factor_name, :phone_number,
|
8
|
+
:type_display_name, :needs_trigger, :user_display_name,
|
9
|
+
:state_token
|
10
|
+
|
11
|
+
def initialize(data)
|
12
|
+
@id = data['id']? data['id'].to_i : nil
|
13
|
+
@active = data['active']
|
14
|
+
@default = data['default']
|
15
|
+
@auth_factor_name = data['auth_factor_name']
|
16
|
+
@phone_number = data['phone_number']
|
17
|
+
@type_display_name = data['type_display_name']
|
18
|
+
@needs_trigger = data['needs_trigger']
|
19
|
+
@user_display_name = data['user_display_name']
|
20
|
+
@state_token = data['state_token']
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -7,7 +7,7 @@ module OneLogin
|
|
7
7
|
attr_accessor :id, :external_id, :email, :username, :firstname, :lastname, :distinguished_name,
|
8
8
|
:phone, :company, :department, :status, :member_of, :samaccountname, :userprincipalname,
|
9
9
|
:group_id, :role_ids, :custom_attributes, :openid_name, :locale_code, :comment, :directory_id,
|
10
|
-
:manager_ad_id, :trusted_idp_id, :activated_at, :created_at, :updated_at,
|
10
|
+
:title, :manager_ad_id, :trusted_idp_id, :activated_at, :created_at, :updated_at,
|
11
11
|
:password_changed_at, :invitation_sent_at, :invalid_login_attempts, :last_login, :locked_until
|
12
12
|
|
13
13
|
def initialize(data)
|
@@ -21,6 +21,7 @@ module OneLogin
|
|
21
21
|
@phone = data['phone'].to_s
|
22
22
|
@company = data['company'].to_s
|
23
23
|
@department = data['department'].to_s
|
24
|
+
@title = data['title'].to_s
|
24
25
|
@status = data['status']
|
25
26
|
@member_of = data['member_of'].to_s
|
26
27
|
@samaccountname = data['samaccountname'].to_s
|
@@ -39,7 +40,7 @@ module OneLogin
|
|
39
40
|
@password_changed_at = data['password_changed_at']? Time.iso8601(data['password_changed_at']) : nil
|
40
41
|
@invitation_sent_at = data['invitation_sent_at']? Time.iso8601(data['invitation_sent_at']) : nil
|
41
42
|
@invalid_login_attempts = data['invalid_login_attempts']
|
42
|
-
@last_login = data['last_login']? Time.iso8601(data['last_login']) : nil
|
43
|
+
@last_login = data['last_login']? Time.iso8601(data['last_login']) : nil
|
43
44
|
@locked_until = data['locked_until']? Time.iso8601(data['locked_until']) : nil
|
44
45
|
end
|
45
46
|
|
@@ -63,6 +64,7 @@ module OneLogin
|
|
63
64
|
user_data.phone = @phone
|
64
65
|
user_data.company = @company
|
65
66
|
user_data.department = @department
|
67
|
+
user_data.title = @title
|
66
68
|
user_data.status = @status
|
67
69
|
user_data.member_of = @member_of
|
68
70
|
user_data.samaccountname = @samaccountname
|
@@ -73,7 +75,7 @@ module OneLogin
|
|
73
75
|
user_data.manager_ad_id = @manager_ad_id
|
74
76
|
user_data.trusted_idp_id = @trusted_idp_id
|
75
77
|
return user_data
|
76
|
-
end
|
78
|
+
end
|
77
79
|
|
78
80
|
def get_user_metadata
|
79
81
|
user_metadata = UserMetadata.new
|
@@ -106,6 +108,7 @@ module OneLogin
|
|
106
108
|
"phone"=> self.phone,
|
107
109
|
"company"=> self.company,
|
108
110
|
"department"=> self.department,
|
111
|
+
"title"=> self.title,
|
109
112
|
"status"=> self.status,
|
110
113
|
"member_of"=> self.member_of,
|
111
114
|
"samaccountname"=> self.samaccountname,
|
@@ -122,4 +125,4 @@ module OneLogin
|
|
122
125
|
end
|
123
126
|
end
|
124
127
|
end
|
125
|
-
end
|
128
|
+
end
|
@@ -6,7 +6,7 @@ module OneLogin
|
|
6
6
|
|
7
7
|
attr_accessor :id, :external_id, :email, :username, :firstname, :lastname, :distinguished_name,
|
8
8
|
:phone, :company, :department, :status, :member_of, :samaccountname, :userprincipalname,
|
9
|
-
:openid_name, :locale_code, :directory_id, :manager_ad_id, :trusted_idp_id
|
9
|
+
:title, :openid_name, :locale_code, :directory_id, :manager_ad_id, :trusted_idp_id
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
data/lib/onelogin/api/models.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'onelogin/api/models/app'
|
2
|
+
require 'onelogin/api/models/auth_factor'
|
2
3
|
require 'onelogin/api/models/device'
|
3
4
|
require 'onelogin/api/models/event'
|
4
5
|
require 'onelogin/api/models/event_type'
|
6
|
+
require 'onelogin/api/models/factor_enrollment_response'
|
5
7
|
require 'onelogin/api/models/group'
|
6
8
|
require 'onelogin/api/models/mfa'
|
7
9
|
require 'onelogin/api/models/onelogin_token'
|
10
|
+
require 'onelogin/api/models/otp_device'
|
8
11
|
require 'onelogin/api/models/rate_limit'
|
9
12
|
require 'onelogin/api/models/role'
|
10
13
|
require 'onelogin/api/models/saml_endpoint_response'
|
@@ -53,6 +53,13 @@ module OneLogin
|
|
53
53
|
GET_SAML_ASSERTION_URL = "https://api.%s.onelogin.com/api/1/saml_assertion"
|
54
54
|
GET_SAML_VERIFY_FACTOR = "https://api.%s.onelogin.com/api/1/saml_assertion/verify_factor"
|
55
55
|
|
56
|
+
# Multi-Factor Authentication URLs
|
57
|
+
GET_FACTORS_URL = "https://api.%s.onelogin.com/api/1/users/%s/auth_factors"
|
58
|
+
ENROLL_FACTOR_URL = "https://api.%s.onelogin.com/api/1/users/%s/otp_devices"
|
59
|
+
GET_ENROLLED_FACTORS_URL = "https://api.%s.onelogin.com/api/1/users/%s/otp_devices"
|
60
|
+
ACTIVATE_FACTOR_URL = "https://api.%s.onelogin.com/api/1/users/%s/otp_devices/%s/trigger"
|
61
|
+
VERIFY_FACTOR_URL = "https://api.%s.onelogin.com/api/1/users/%s/otp_devices/%s/verify"
|
62
|
+
|
56
63
|
# Invite Link URLS
|
57
64
|
GENERATE_INVITE_LINK_URL = "https://api.%s.onelogin.com/api/1/invites/get_invite_link"
|
58
65
|
SEND_INVITE_LINK_URL = "https://api.%s.onelogin.com/api/1/invites/send_invite_link"
|
@@ -7,12 +7,15 @@ module OneLogin
|
|
7
7
|
#
|
8
8
|
# @param base [String] Base of the endpoint
|
9
9
|
# @param obj_id [String, nil] Id of the referenced object
|
10
|
+
# @param extra_id [String, nil] Id of the secundary referenced object
|
10
11
|
#
|
11
|
-
def url_for(base, obj_id=nil)
|
12
|
+
def url_for(base, obj_id=nil, extra_id=nil)
|
12
13
|
if obj_id.nil? || obj_id.to_s.empty?
|
13
14
|
base % [@region]
|
14
|
-
|
15
|
+
elsif extra_id.nil? || extra_id.to_s.empty?
|
15
16
|
base % [@region, obj_id]
|
17
|
+
else
|
18
|
+
base % [@region, obj_id, extra_id]
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
data/lib/onelogin/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module OneLogin
|
2
|
-
VERSION = "1.0.
|
3
|
-
end
|
2
|
+
VERSION = "1.0.3"
|
3
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onelogin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OneLogin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -99,19 +99,29 @@ files:
|
|
99
99
|
- Rakefile
|
100
100
|
- bin/console
|
101
101
|
- bin/setup
|
102
|
+
- examples/Gemfile
|
103
|
+
- examples/Gemfile.lock
|
104
|
+
- examples/README.md
|
105
|
+
- examples/all-users-to-csv.rb
|
106
|
+
- examples/create-user.rb
|
107
|
+
- examples/events-to-csv.rb
|
108
|
+
- examples/list-users.rb
|
102
109
|
- lib/onelogin.rb
|
103
110
|
- lib/onelogin/api.rb
|
104
111
|
- lib/onelogin/api/client.rb
|
105
112
|
- lib/onelogin/api/cursor.rb
|
106
113
|
- lib/onelogin/api/models.rb
|
107
114
|
- lib/onelogin/api/models/app.rb
|
115
|
+
- lib/onelogin/api/models/auth_factor.rb
|
108
116
|
- lib/onelogin/api/models/device.rb
|
109
117
|
- lib/onelogin/api/models/embed_app.rb
|
110
118
|
- lib/onelogin/api/models/event.rb
|
111
119
|
- lib/onelogin/api/models/event_type.rb
|
120
|
+
- lib/onelogin/api/models/factor_enrollment_response.rb
|
112
121
|
- lib/onelogin/api/models/group.rb
|
113
122
|
- lib/onelogin/api/models/mfa.rb
|
114
123
|
- lib/onelogin/api/models/onelogin_token.rb
|
124
|
+
- lib/onelogin/api/models/otp_device.rb
|
115
125
|
- lib/onelogin/api/models/rate_limit.rb
|
116
126
|
- lib/onelogin/api/models/role.rb
|
117
127
|
- lib/onelogin/api/models/saml_endpoint_response.rb
|