onelogin 1.3.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/git-secrets-public.yml +55 -0
- data/README.md +64 -0
- data/examples/Gemfile.lock +10 -6
- data/examples/another-get-all-login-events-of-last-day-to-csv.rb +141 -0
- data/examples/events-to-csv.rb +3 -3
- data/examples/get-all-login-events-of-last-day-to-csv.rb +88 -0
- data/examples/rails-custom-login-page/Gemfile +2 -2
- data/examples/rails-custom-login-page/Gemfile.lock +20 -16
- data/examples/rails-custom-login-page/README.md +35 -2
- data/examples/rails-custom-login-page/app/assets/stylesheets/application.css +1 -61
- data/examples/rails-custom-login-page/app/controllers/home_controller.rb +1 -0
- data/examples/rails-custom-login-page/app/controllers/sessions_controller.rb +4 -4
- data/examples/rails-custom-login-page/app/controllers/users_controller.rb +48 -14
- data/examples/rails-custom-login-page/app/helpers/sessions_helper.rb +1 -1
- data/examples/rails-custom-login-page/app/helpers/users_helper.rb +1 -0
- data/examples/rails-custom-login-page/app/views/dashboard/index.html.erb +2 -9
- data/examples/rails-custom-login-page/app/views/home/index.html.erb +84 -18
- data/examples/rails-custom-login-page/app/views/layouts/application.html.erb +13 -1
- data/examples/rails-custom-login-page/app/views/users/edit.html.erb +30 -24
- data/examples/rails-custom-login-page/app/views/users/index.html.erb +30 -27
- data/examples/rails-custom-login-page/app/views/users/new.html.erb +58 -3
- data/examples/rails-custom-login-page/app/views/users/onboard.html.erb +54 -0
- data/examples/rails-custom-login-page/app/views/users/show.html.erb +16 -13
- data/examples/rails-custom-login-page/config/initializers/onelogin.rb +3 -1
- data/examples/rails-custom-login-page/config/routes.rb +4 -0
- data/examples/rails-custom-login-page/config/secrets.yml.sample +2 -0
- data/lib/onelogin/api/client.rb +682 -10
- data/lib/onelogin/api/cursor.rb +4 -3
- data/lib/onelogin/api/models/connector_basic.rb +20 -0
- data/lib/onelogin/api/models/event.rb +6 -1
- data/lib/onelogin/api/models/event_type.rb +2 -2
- data/lib/onelogin/api/models/mfa_token.rb +18 -0
- data/lib/onelogin/api/models/onelogin_app.rb +62 -0
- data/lib/onelogin/api/models/onelogin_app_basic.rb +51 -0
- data/lib/onelogin/api/models/onelogin_app_v1.rb +22 -0
- data/lib/onelogin/api/models/user.rb +1 -1
- data/lib/onelogin/api/models.rb +5 -0
- data/lib/onelogin/api/util/constants.rb +18 -0
- data/lib/onelogin/version.rb +1 -1
- data/onelogin.gemspec +2 -2
- metadata +16 -7
@@ -1,7 +1,7 @@
|
|
1
1
|
class SessionsController < ApplicationController
|
2
2
|
def new
|
3
3
|
response = log_in(params['username'], params['password'])
|
4
|
-
status = response ? :
|
4
|
+
status = response[:error] ? :unauthorized : :ok
|
5
5
|
|
6
6
|
render json: response, status: status
|
7
7
|
end
|
@@ -17,7 +17,7 @@ class SessionsController < ApplicationController
|
|
17
17
|
# available to verify token before
|
18
18
|
# password reset is completed
|
19
19
|
def forgot_password
|
20
|
-
user = validate_user(params['
|
20
|
+
user = validate_user(params['forgot_username'])
|
21
21
|
|
22
22
|
devices = get_mfa_devices(user.id)
|
23
23
|
|
@@ -28,9 +28,9 @@ class SessionsController < ApplicationController
|
|
28
28
|
|
29
29
|
# Verify MFA token and then update password
|
30
30
|
def reset_password
|
31
|
-
if verify_token(params['
|
31
|
+
if verify_token(params['reset_device_id'], params['reset_otp_token'])
|
32
32
|
status = :ok
|
33
|
-
response = set_password(session[:user_id], params['
|
33
|
+
response = set_password(session[:user_id], params['new_password'])
|
34
34
|
else
|
35
35
|
status = :unauthorized
|
36
36
|
response = 'Invalid token'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class UsersController < ApplicationController
|
2
2
|
|
3
|
-
before_action :require_current_user
|
3
|
+
before_action :require_current_user, except: [:new, :create, :onboard, :activate]
|
4
4
|
before_action :set_user, only: [:show, :edit, :update, :destroy]
|
5
5
|
|
6
6
|
# GET /users
|
@@ -16,7 +16,6 @@ class UsersController < ApplicationController
|
|
16
16
|
|
17
17
|
# GET /users/new
|
18
18
|
def new
|
19
|
-
@user = User.new
|
20
19
|
end
|
21
20
|
|
22
21
|
# GET /users/1/edit
|
@@ -26,17 +25,52 @@ class UsersController < ApplicationController
|
|
26
25
|
# POST /users
|
27
26
|
# POST /users.json
|
28
27
|
def create
|
29
|
-
|
28
|
+
# Create a user
|
29
|
+
user = api_client.create_user(user_params)
|
30
|
+
# Update custom attributes
|
31
|
+
api_client.set_custom_attribute_to_user(user.id, custom_user_params)
|
32
|
+
# Set status to unactivated
|
33
|
+
api_client.update_user(user.id, status: 0)
|
30
34
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
if api_client.error
|
36
|
+
puts api_client.error_description
|
37
|
+
end
|
38
|
+
|
39
|
+
redirect_to onboard_path, notice: 'User has been created with status set to unactivated'
|
40
|
+
end
|
41
|
+
|
42
|
+
# GET /onboard
|
43
|
+
def onboard
|
44
|
+
end
|
45
|
+
|
46
|
+
# POST /activate
|
47
|
+
def activate
|
48
|
+
# Search for a user with this email address
|
49
|
+
@user = api_client.get_users(email: user_params[:email]).first
|
50
|
+
|
51
|
+
unless @user && verify_dob && verify_ssn
|
52
|
+
return redirect_to onboard_path, notice: "User #{user_params[:email]} was not verified"
|
53
|
+
end
|
54
|
+
|
55
|
+
# Update password
|
56
|
+
unless api_client.set_password_using_clear_text(@user.id, user_params[:password], user_params[:password])
|
57
|
+
return redirect_to onboard_path, notice: "Password update failed. #{api_client.error_description}"
|
39
58
|
end
|
59
|
+
|
60
|
+
# Activate user
|
61
|
+
api_client.update_user(@user.id, status: 1)
|
62
|
+
|
63
|
+
# Redirect to login page
|
64
|
+
redirect_to home_index_path
|
65
|
+
end
|
66
|
+
|
67
|
+
# Verify dob and ssn match
|
68
|
+
def verify_ssn
|
69
|
+
@user.custom_attributes["custom_ssn"].eql? (custom_user_params[:custom_ssn])
|
70
|
+
end
|
71
|
+
|
72
|
+
def verify_dob
|
73
|
+
@user.custom_attributes["custom_dob"].eql? (custom_user_params[:custom_dob])
|
40
74
|
end
|
41
75
|
|
42
76
|
# PATCH/PUT /users/1
|
@@ -70,17 +104,17 @@ class UsersController < ApplicationController
|
|
70
104
|
end
|
71
105
|
|
72
106
|
private
|
73
|
-
|
107
|
+
|
74
108
|
def set_user
|
75
109
|
@user = api_client.get_user(params[:id])
|
76
110
|
end
|
77
111
|
|
78
112
|
# Never trust parameters from the scary internet, only allow the white list through.
|
79
113
|
def user_params
|
80
|
-
params.permit(:firstname, :lastname, :email, :phone, :
|
114
|
+
params.permit(:firstname, :lastname, :email, :phone, :username, :password)
|
81
115
|
end
|
82
116
|
|
83
117
|
def custom_user_params
|
84
|
-
params.permit(:custom_field)
|
118
|
+
params.permit(:custom_field, :custom_dob, :custom_ssn)
|
85
119
|
end
|
86
120
|
end
|
@@ -8,7 +8,7 @@ module SessionsHelper
|
|
8
8
|
},
|
9
9
|
request.base_url # included for CORS session cookie request
|
10
10
|
)
|
11
|
-
return
|
11
|
+
return { error: api_client.error_description } unless response
|
12
12
|
|
13
13
|
if response.is_a? OneLogin::Api::Models::SessionTokenMFAInfo
|
14
14
|
session[:state_token] = response.state_token
|
@@ -14,8 +14,9 @@
|
|
14
14
|
<div class="col-sm">
|
15
15
|
<h2>Apps</h2>
|
16
16
|
<ul class="list-group">
|
17
|
+
<% url_base = CUSTOM_DOMAIN || ONELOGIN_SUBDOMAIN + ".onelogin.com" %>
|
17
18
|
<%@apps.each do |app|%>
|
18
|
-
<li class="list-group-item"><a href="https://<%=
|
19
|
+
<li class="list-group-item"><a target="_blank" href="https://<%= url_base %>/launch/<%= app.id %>"><%= app.name %></a></li>
|
19
20
|
<%end%>
|
20
21
|
</ul>
|
21
22
|
</div>
|
@@ -40,11 +41,3 @@
|
|
40
41
|
</div>
|
41
42
|
</div>
|
42
43
|
</div>
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
@@ -11,6 +11,15 @@
|
|
11
11
|
<div class="alert alert-danger message" role="alert">
|
12
12
|
</div>
|
13
13
|
|
14
|
+
<% url_base = CUSTOM_DOMAIN || ONELOGIN_SUBDOMAIN + ".onelogin.com" %>
|
15
|
+
<% url_create_session = "https://" + url_base + "/session_via_api_token" %>
|
16
|
+
|
17
|
+
<form action="<%= url_create_session %>" method="post" class="cookie-session-post-form">
|
18
|
+
<input type="hidden" id="cookie_session_token" name="session_token" value="">
|
19
|
+
<input id="auth_token" type="hidden">
|
20
|
+
<button type="submit">Creating Session ...</button>
|
21
|
+
</form>
|
22
|
+
|
14
23
|
<%= form_tag("/login", method: "post", class: 'login-form') do %>
|
15
24
|
<div class="form-group">
|
16
25
|
<label for="username">Username</label>
|
@@ -20,7 +29,9 @@
|
|
20
29
|
<label for="password">Password</label>
|
21
30
|
<%= password_field_tag :password, nil, placeholder: 'Enter Password', class: 'form-control' %>
|
22
31
|
</div>
|
23
|
-
<button type="submit" class="btn btn-primary">Login</button>
|
32
|
+
<button type="submit" class="btn btn-primary">Login</button>
|
33
|
+
<hr/>
|
34
|
+
<a href="#" class="forgot">Forgot Password</a> | <a href="/signup">Sign Up</a>
|
24
35
|
<% end %>
|
25
36
|
|
26
37
|
<%= form_tag("/verify_mfa", method: "post", class: 'mfa-form') do %>
|
@@ -37,28 +48,30 @@
|
|
37
48
|
|
38
49
|
<%= form_tag("/forgot_password", method: "post", class: 'forgot-password-form') do %>
|
39
50
|
<div class="form-group">
|
40
|
-
<label for="
|
41
|
-
<%= text_field_tag :
|
51
|
+
<label for="forgot_username">Username</label>
|
52
|
+
<%= text_field_tag :forgot_username, nil, placeholder: 'Enter Username', class: 'form-control' %>
|
42
53
|
</div>
|
43
54
|
<button type="submit" class="btn btn-primary">Reset Password</button> or <a href="/">Login</a>
|
44
55
|
<% end %>
|
45
56
|
|
46
57
|
<%= form_tag("/reset_password", method: "post", class: 'reset-password-form') do %>
|
47
58
|
<div class="form-group">
|
48
|
-
<label for="
|
49
|
-
<%= select_tag :
|
59
|
+
<label for="reset_device_id">MFA Device</label>
|
60
|
+
<%= select_tag :reset_device_id, nil, {:class => 'form-control'} %>
|
50
61
|
</div>
|
51
62
|
<div class="form-group">
|
52
|
-
<label for="
|
53
|
-
<%= text_field_tag :
|
63
|
+
<label for="reset_otp_token">Token</label>
|
64
|
+
<%= text_field_tag :reset_otp_token, nil, placeholder: 'Enter Token', class: 'form-control' %>
|
54
65
|
</div>
|
55
66
|
<div class="form-group">
|
56
|
-
<label for="
|
57
|
-
<%= password_field_tag :
|
67
|
+
<label for="new_password">New Password</label>
|
68
|
+
<%= password_field_tag :new_password, nil, placeholder: 'Enter New Password', class: 'form-control' %>
|
58
69
|
</div>
|
59
70
|
<button type="submit" class="btn btn-primary">Save Password</button>
|
60
71
|
<% end %>
|
61
72
|
|
73
|
+
<form method="POST" action="" id="sp"></form>
|
74
|
+
|
62
75
|
</div>
|
63
76
|
<div class="col-sm">
|
64
77
|
</div>
|
@@ -70,19 +83,42 @@
|
|
70
83
|
|
71
84
|
<script type="text/javascript">
|
72
85
|
|
73
|
-
var ONELOGIN_SUBDOMAIN = "<%= ONELOGIN_SUBDOMAIN %>"
|
86
|
+
var ONELOGIN_SUBDOMAIN = "<%= ONELOGIN_SUBDOMAIN %>";
|
87
|
+
var CUSTOM_DOMAIN = "<%= CUSTOM_DOMAIN %>";
|
88
|
+
var COOKIE_VIA_POST_FORM = <%= COOKIE_VIA_POST_FORM || false %>;
|
74
89
|
|
75
90
|
function makeCors(session_token) {
|
76
91
|
var xhr = new XMLHttpRequest();
|
77
92
|
xhr.withCredentials = true;
|
78
93
|
method = "POST";
|
79
|
-
|
94
|
+
if (CUSTOM_DOMAIN) {
|
95
|
+
var url = "https://" + CUSTOM_DOMAIN + "/session_via_api_token";
|
96
|
+
} else {
|
97
|
+
var url = "https://" + ONELOGIN_SUBDOMAIN + ".onelogin.com/session_via_api_token";
|
98
|
+
}
|
80
99
|
xhr.open(method, url, true);
|
81
100
|
xhr.setRequestHeader("Content-Type", "application/json");
|
82
101
|
body = {"session_token": session_token};
|
102
|
+
xhr.onreadystatechange = function () {
|
103
|
+
if(xhr.readyState === 4 && xhr.status === 200) {
|
104
|
+
if(getUrlParameter("origin")){
|
105
|
+
// If there is an origin SP then redirect to it
|
106
|
+
redirectToSP()
|
107
|
+
} else{
|
108
|
+
// Otherwise redirect to the main dashboard
|
109
|
+
window.location.href = '/dashboard';
|
110
|
+
}
|
111
|
+
}
|
112
|
+
};
|
83
113
|
xhr.send(JSON.stringify(body));
|
84
114
|
};
|
85
115
|
|
116
|
+
function sendPostForm(session_token){
|
117
|
+
$(".cookie-session-post-form").show();
|
118
|
+
$("#cookie_session_token").val(session_token);
|
119
|
+
$(".cookie-session-post-form").submit();
|
120
|
+
}
|
121
|
+
|
86
122
|
function showAlert(type, message){
|
87
123
|
$(".message").removeClass("alert-danger").removeClass("alert-success");
|
88
124
|
$(".message").addClass("alert-" + type).text(message).show();
|
@@ -92,9 +128,32 @@
|
|
92
128
|
$(".message").hide();
|
93
129
|
}
|
94
130
|
|
131
|
+
function getUrlParameter(sParam) {
|
132
|
+
var sPageURL = window.location.search.substring(1),
|
133
|
+
sURLVariables = sPageURL.split('&'),
|
134
|
+
sParameterName,
|
135
|
+
i;
|
136
|
+
|
137
|
+
for (i = 0; i < sURLVariables.length; i++) {
|
138
|
+
sParameterName = sURLVariables[i].split('=');
|
139
|
+
|
140
|
+
if (sParameterName[0] === sParam) {
|
141
|
+
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
|
142
|
+
}
|
143
|
+
}
|
144
|
+
};
|
145
|
+
|
146
|
+
function redirectToSP() {
|
147
|
+
var origin = getUrlParameter("origin");
|
148
|
+
var samlRequest = getUrlParameter("SAMLRequest");
|
149
|
+
var url = origin + "&SAMLRequest=" + samlRequest;
|
150
|
+
$("#sp").attr("action", url).submit();
|
151
|
+
}
|
152
|
+
|
95
153
|
$(function(){
|
96
154
|
hideAlert();
|
97
155
|
$(".login-form").show();
|
156
|
+
$(".cookie-session-post-form").hide();
|
98
157
|
$(".mfa-form").hide();
|
99
158
|
$(".forgot-password-form").hide();
|
100
159
|
$(".reset-password-form").hide();
|
@@ -122,14 +181,18 @@
|
|
122
181
|
$(".login-form").hide();
|
123
182
|
$(".mfa-form").show();
|
124
183
|
|
125
|
-
}else{
|
126
|
-
|
127
|
-
|
184
|
+
} else {
|
185
|
+
if (typeof COOKIE_VIA_POST_FORM === 'boolean' && COOKIE_VIA_POST_FORM === true) {
|
186
|
+
sendPostForm(res.session_token);
|
187
|
+
} else {
|
188
|
+
makeCors(res.session_token);
|
189
|
+
}
|
128
190
|
}
|
129
191
|
},
|
130
192
|
error: function(xhr, status, err) {
|
131
193
|
console.log(err);
|
132
|
-
|
194
|
+
console.log(xhr);
|
195
|
+
showAlert('danger', xhr.responseJSON.error);
|
133
196
|
$(".login-form input[type=submit]").removeAttr("disabled");
|
134
197
|
},
|
135
198
|
});
|
@@ -144,8 +207,11 @@
|
|
144
207
|
success: function(res, status, xhr) {
|
145
208
|
console.log(res);
|
146
209
|
|
147
|
-
|
148
|
-
|
210
|
+
if (typeof COOKIE_VIA_POST_FORM === 'boolean' && COOKIE_VIA_POST_FORM === true) {
|
211
|
+
sendPostForm(res.session_token);
|
212
|
+
} else {
|
213
|
+
makeCors(res.session_token);
|
214
|
+
}
|
149
215
|
},
|
150
216
|
error: function(xhr, status, err) {
|
151
217
|
console.log(err);
|
@@ -203,4 +269,4 @@
|
|
203
269
|
event.preventDefault();
|
204
270
|
});
|
205
271
|
})
|
206
|
-
</script>
|
272
|
+
</script>
|
@@ -10,8 +10,20 @@
|
|
10
10
|
</head>
|
11
11
|
|
12
12
|
<body>
|
13
|
+
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
14
|
+
<a class="navbar-brand" href="#">OneLogin Ruby SDK Sample</a>
|
15
|
+
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
|
16
|
+
<div class="navbar-nav">
|
17
|
+
<a class="nav-item nav-link active" href="/">Login</a>
|
18
|
+
<a class="nav-item nav-link" href="/signup">Sign Up</a>
|
19
|
+
<a class="nav-item nav-link" href="/onboard">Onboard</a>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</nav>
|
23
|
+
|
24
|
+
|
13
25
|
<% flash.each do |key, value| %>
|
14
|
-
<div class="alert alert
|
26
|
+
<div class="alert alert-warning"><%= value %></div>
|
15
27
|
<% end %>
|
16
28
|
|
17
29
|
<%= yield %>
|
@@ -1,27 +1,33 @@
|
|
1
|
-
<
|
1
|
+
<div class="container">
|
2
|
+
<div class="row">
|
3
|
+
<div class="col-sm">
|
4
|
+
<p><%= link_to 'Back', users_path %></p>
|
2
5
|
|
3
|
-
|
6
|
+
<h2>Edit User</h2>
|
4
7
|
|
5
|
-
|
6
|
-
|
8
|
+
<%= form_tag update_user_path, method: "patch", class: "edit" do %>
|
9
|
+
<div class="form-group">
|
10
|
+
<label for="firstname">First Name</label>
|
11
|
+
<input type="text" name="firstname" value="<%= @user.firstname%>" class="form-control">
|
12
|
+
</div>
|
13
|
+
<div class="form-group">
|
14
|
+
<label for="lastname">Last Name</label>
|
15
|
+
<input type="text" name="lastname" value="<%= @user.lastname%>" class="form-control">
|
16
|
+
</div>
|
17
|
+
<div class="form-group">
|
18
|
+
<label for="email">Email</label>
|
19
|
+
<input type="text" name="email" value="<%= @user.email%>" class="form-control">
|
20
|
+
</div>
|
21
|
+
<div class="form-group">
|
22
|
+
<label for="email">Phone</label>
|
23
|
+
<input type="text" name="phone" value="<%= @user.phone%>" class="form-control">
|
24
|
+
</div>
|
25
|
+
<div class="form-group">
|
26
|
+
<label for="email">Custom Field</label>
|
27
|
+
<input type="text" name="custom_field" value="<%= @user.custom_attributes['custom_field'] if @user.custom_attributes.present? %>" class="form-control">
|
28
|
+
</div>
|
29
|
+
<button type="submit" class="btn btn-primary">Save</button>
|
30
|
+
<% end %>
|
31
|
+
</div>
|
7
32
|
</div>
|
8
|
-
|
9
|
-
Last Name: <input type="text" name="lastname" value="<%= @user.lastname%>">
|
10
|
-
</div>
|
11
|
-
<div>
|
12
|
-
Email: <input type="text" name="email" value="<%= @user.email%>">
|
13
|
-
</div>
|
14
|
-
<div>
|
15
|
-
Phone: <input type="text" name="phone" value="<%= @user.phone%>">
|
16
|
-
</div>
|
17
|
-
</div>
|
18
|
-
<div>
|
19
|
-
Custom Field: <input type="text" name="custom_field" value="<%= @user.custom_attributes['custom_field']%>">
|
20
|
-
</div>
|
21
|
-
|
22
|
-
<div class="actions">
|
23
|
-
<%= submit_tag %>
|
24
|
-
</div>
|
25
|
-
<% end %>
|
26
|
-
|
27
|
-
<%= link_to 'Back', users_path %>
|
33
|
+
</div>
|
@@ -1,30 +1,33 @@
|
|
1
1
|
<p id="notice"><%= notice %></p>
|
2
2
|
|
3
|
-
<
|
3
|
+
<div class="container">
|
4
|
+
<div class="row">
|
5
|
+
<div class="col-sm">
|
6
|
+
<h2>Users</h2>
|
7
|
+
<table class="table">
|
8
|
+
<thead>
|
9
|
+
<tr>
|
10
|
+
<th scope="col">Name</th>
|
11
|
+
<th scope="col">Email</th>
|
12
|
+
<th scope="col">Phone</th>
|
13
|
+
<th scope="col">Custom Field</th>
|
14
|
+
<th scope="col" colspan="2"></th>
|
15
|
+
</tr>
|
16
|
+
</thead>
|
4
17
|
|
5
|
-
<
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
<td><%= user.phone %></td>
|
22
|
-
<td><%= user.custom_attributes["custom_field"] if user.custom_attributes.is_a?(Hash) %></td>
|
23
|
-
<td><%= link_to 'Show', user_path(user.id) %></td>
|
24
|
-
<td><%= link_to 'Edit', edit_user_path(user.id) %></td>
|
25
|
-
</tr>
|
26
|
-
<% end %>
|
27
|
-
</tbody>
|
28
|
-
</table>
|
29
|
-
|
30
|
-
<br>
|
18
|
+
<tbody>
|
19
|
+
<% @users.each do |user| %>
|
20
|
+
<tr>
|
21
|
+
<td scope="row"><%= user.firstname %> <%= user.lastname %></td>
|
22
|
+
<td><%= user.email %></td>
|
23
|
+
<td><%= user.phone %></td>
|
24
|
+
<td><%= user.custom_attributes["custom_field"] if user.custom_attributes.is_a?(Hash) %></td>
|
25
|
+
<td><%= link_to 'Show', user_path(user.id) %></td>
|
26
|
+
<td><%= link_to 'Edit', edit_user_path(user.id) %></td>
|
27
|
+
</tr>
|
28
|
+
<% end %>
|
29
|
+
</tbody>
|
30
|
+
</table>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
</div>
|
@@ -1,5 +1,60 @@
|
|
1
|
-
<
|
1
|
+
<div class="jumbotron">
|
2
|
+
<p>This is a simple demo of how to sign up a new user and then make them activate their account</p>
|
3
|
+
</div>
|
2
4
|
|
3
|
-
|
5
|
+
<div class="container">
|
6
|
+
<div class="row">
|
7
|
+
<div class="col-sm">
|
8
|
+
</div>
|
9
|
+
<div class="col-sm">
|
4
10
|
|
5
|
-
|
11
|
+
<div class="alert alert-danger message" role="alert">
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= form_tag("/users", method: "post", class: 'signup-form') do %>
|
15
|
+
<div class="form-group">
|
16
|
+
<label for="firstname">First Name</label>
|
17
|
+
<%= text_field_tag :firstname, nil, placeholder: 'First Name', class: 'form-control' %>
|
18
|
+
</div>
|
19
|
+
<div class="form-group">
|
20
|
+
<label for="lastname">Last Name</label>
|
21
|
+
<%= text_field_tag :lastname, nil, placeholder: 'Last Name', class: 'form-control' %>
|
22
|
+
</div>
|
23
|
+
<div class="form-group">
|
24
|
+
<label for="email">Email</label>
|
25
|
+
<%= text_field_tag :email, nil, placeholder: 'Email Address', class: 'form-control' %>
|
26
|
+
</div>
|
27
|
+
<div class="form-group">
|
28
|
+
<label for="custom_dob">Date of Birth</label>
|
29
|
+
<%= text_field_tag :custom_dob, nil, placeholder: 'mm/dd/yyyy', class: 'form-control' %>
|
30
|
+
</div>
|
31
|
+
<div class="form-group">
|
32
|
+
<label for="custom_ssn">Last 4 of SSN</label>
|
33
|
+
<%= text_field_tag :custom_ssn, nil, placeholder: 'Last 4 of SSN', class: 'form-control' %>
|
34
|
+
</div>
|
35
|
+
<button type="submit" class="btn btn-primary">Sign Up</button>
|
36
|
+
<hr/>
|
37
|
+
<a href="/">Login</a>
|
38
|
+
<% end %>
|
39
|
+
|
40
|
+
</div>
|
41
|
+
<div class="col-sm">
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
|
46
|
+
|
47
|
+
<script type="text/javascript">
|
48
|
+
function showAlert(type, message){
|
49
|
+
$(".message").removeClass("alert-danger").removeClass("alert-success");
|
50
|
+
$(".message").addClass("alert-" + type).text(message).show();
|
51
|
+
$(".message").show();
|
52
|
+
}
|
53
|
+
function hideAlert(){
|
54
|
+
$(".message").hide();
|
55
|
+
}
|
56
|
+
|
57
|
+
$(function(){
|
58
|
+
hideAlert();
|
59
|
+
})
|
60
|
+
</script>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<div class="jumbotron">
|
2
|
+
<p>This shows how an unactivated user could supply infomation to complete a sign up flow</p>
|
3
|
+
</div>
|
4
|
+
|
5
|
+
<div class="container">
|
6
|
+
<div class="row">
|
7
|
+
<div class="col-sm">
|
8
|
+
</div>
|
9
|
+
<div class="col-sm">
|
10
|
+
|
11
|
+
<div class="alert alert-danger message" role="alert">
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= form_tag("/activate", method: "post", class: 'signup-form') do %>
|
15
|
+
<div class="form-group">
|
16
|
+
<label for="email">Email</label>
|
17
|
+
<%= text_field_tag :email, nil, placeholder: 'Email Address', class: 'form-control' %>
|
18
|
+
</div>
|
19
|
+
<div class="form-group">
|
20
|
+
<label for="custom_dob">Date of Birth</label>
|
21
|
+
<%= text_field_tag :custom_dob, nil, placeholder: 'mm/dd/yyyy', class: 'form-control' %>
|
22
|
+
</div>
|
23
|
+
<div class="form-group">
|
24
|
+
<label for="custom_ssn">Last 4 of SSN</label>
|
25
|
+
<%= text_field_tag :custom_ssn, nil, placeholder: 'Last 4 of SSN', class: 'form-control' %>
|
26
|
+
</div>
|
27
|
+
<div class="form-group">
|
28
|
+
<label for="password">Password</label>
|
29
|
+
<%= password_field_tag :password, nil, placeholder: 'Make up a password', class: 'form-control' %>
|
30
|
+
</div>
|
31
|
+
<button type="submit" class="btn btn-primary">Activate Account</button>
|
32
|
+
<% end %>
|
33
|
+
|
34
|
+
</div>
|
35
|
+
<div class="col-sm">
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
|
41
|
+
<script type="text/javascript">
|
42
|
+
function showAlert(type, message){
|
43
|
+
$(".message").removeClass("alert-danger").removeClass("alert-success");
|
44
|
+
$(".message").addClass("alert-" + type).text(message).show();
|
45
|
+
$(".message").show();
|
46
|
+
}
|
47
|
+
function hideAlert(){
|
48
|
+
$(".message").hide();
|
49
|
+
}
|
50
|
+
|
51
|
+
$(function(){
|
52
|
+
hideAlert();
|
53
|
+
})
|
54
|
+
</script>
|
@@ -1,14 +1,17 @@
|
|
1
|
-
<
|
1
|
+
<div class="container">
|
2
|
+
<div class="row">
|
3
|
+
<div class="col-sm">
|
4
|
+
<%= link_to 'Edit', edit_user_path(@user.id) %> |
|
5
|
+
<%= link_to 'Back', users_path %>
|
2
6
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
<
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
</
|
13
|
-
|
14
|
-
</ul>
|
7
|
+
<h2><%= @user.firstname %> <%= @user.lastname %></h2>
|
8
|
+
<ul class="list-group">
|
9
|
+
<%@user.instance_values.symbolize_keys.each do |k, v|%>
|
10
|
+
<li class="list-group-item">
|
11
|
+
<b><%= k%>:</b> <%= v%>
|
12
|
+
</li>
|
13
|
+
<%end%>
|
14
|
+
</ul>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</div>
|
@@ -1,4 +1,6 @@
|
|
1
1
|
ONELOGIN_CLIENT_ID = Rails.application.secrets.ONELOGIN_CLIENT_ID
|
2
2
|
ONELOGIN_CLIENT_SECRET = Rails.application.secrets.ONELOGIN_CLIENT_SECRET
|
3
3
|
ONELOGIN_REGION = Rails.application.secrets.ONELOGIN_REGION
|
4
|
-
ONELOGIN_SUBDOMAIN = Rails.application.secrets.ONELOGIN_SUBDOMAIN
|
4
|
+
ONELOGIN_SUBDOMAIN = Rails.application.secrets.ONELOGIN_SUBDOMAIN
|
5
|
+
CUSTOM_DOMAIN = Rails.application.secrets.CUSTOM_DOMAIN
|
6
|
+
COOKIE_VIA_POST_FORM = Rails.application.secrets.COOKIE_VIA_POST_FORM
|