Skip to content

Commit 2b1ed3c

Browse files
committed
add passive login page
1 parent a8f2b31 commit 2b1ed3c

4 files changed

Lines changed: 156 additions & 28 deletions

File tree

OpenFlow/src/LoginProvider.ts

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as winston from "winston";
33
import * as express from "express";
44
import * as cookieSession from "cookie-session";
55
import * as bodyParser from "body-parser";
6+
import * as path from "path";
67

78
import * as SAMLStrategy from "passport-saml";
89
import * as GoogleStrategy from "passport-google-oauth20";
@@ -90,6 +91,21 @@ export class LoginProvider {
9091
});
9192
}
9293

94+
static async getProviders(): Promise<any[]> {
95+
LoginProvider.login_providers = await Config.db.query<Provider>({ _type: "provider" }, null, 10, 0, null, "config", TokenUser.rootToken());
96+
var result: any[] = [];
97+
LoginProvider.login_providers.forEach(provider => {
98+
var item: any = { name: provider.name, id: provider.id, provider: provider.provider, logo: "fa-question-circle" };
99+
if (provider.provider === "google") { item.logo = "fa-google"; }
100+
if (provider.provider === "saml") { item.logo = "fa-windows"; }
101+
result.push(item);
102+
});
103+
if (result.length === 0) {
104+
var item: any = { name: "Local", id: "local", provider: "local", logo: "fa-question-circle" };
105+
result.push(item);
106+
}
107+
return result;
108+
}
93109
static async configure(logger: winston.Logger, app: express.Express, baseurl: string): Promise<void> {
94110
this._logger = logger;
95111
app.use(cookieSession({
@@ -109,14 +125,20 @@ export class LoginProvider {
109125

110126
app.get("/Signout", (req: any, res: any, next: any): void => {
111127
req.logout();
112-
res.redirect("/");
128+
var originalUrl: any = req.cookies.originalUrl;
129+
if (!Util.IsNullEmpty(originalUrl)) {
130+
res.cookie("originalUrl", "", { expires: new Date() });
131+
res.redirect(originalUrl);
132+
} else {
133+
res.redirect("/");
134+
}
113135
});
114136
await LoginProvider.RegisterProviders(app, baseurl);
115137
app.get("/jwt", (req: any, res: any, next: any): void => {
116138
res.setHeader("Content-Type", "application/json");
117139
if (req.user) {
118140
var user: TokenUser = new TokenUser(req.user);
119-
res.end(JSON.stringify({ jwt: Crypt.createToken(user, "5m") }));
141+
res.end(JSON.stringify({ jwt: Crypt.createToken(user, "5m"), user: user }));
120142
} else {
121143
res.end(JSON.stringify({ jwt: "" }));
122144
}
@@ -152,20 +174,27 @@ export class LoginProvider {
152174
}
153175
res.end(JSON.stringify(res2));
154176
});
177+
app.get("/login", async (req: any, res: any, next: any): Promise<void> => {
178+
try {
179+
res.cookie("originalUrl", req.originalUrl, { maxAge: 900000, httpOnly: true });
180+
var file = path.join(__dirname, 'public', 'PassiveLogin.html');
181+
res.sendFile(file);
182+
// var result: any[] = await this.getProviders();
183+
// res.setHeader("Content-Type", "application/json");
184+
// res.end(JSON.stringify(result));
185+
// res.end();
186+
} catch (error) {
187+
res.end(error);
188+
console.error(error);
189+
}
190+
try {
191+
LoginProvider.RegisterProviders(app, baseurl);
192+
} catch (error) {
193+
}
194+
});
155195
app.get("/loginproviders", async (req: any, res: any, next: any): Promise<void> => {
156196
try {
157-
LoginProvider.login_providers = await Config.db.query<Provider>({ _type: "provider" }, null, 10, 0, null, "config", TokenUser.rootToken());
158-
var result: any[] = [];
159-
LoginProvider.login_providers.forEach(provider => {
160-
var item: any = { name: provider.name, id: provider.id, provider: provider.provider, logo: "fa-question-circle" };
161-
if (provider.provider === "google") { item.logo = "fa-google"; }
162-
if (provider.provider === "saml") { item.logo = "fa-windows"; }
163-
result.push(item);
164-
});
165-
if (result.length === 0) {
166-
var item: any = { name: "Local", id: "local", provider: "local", logo: "fa-question-circle" };
167-
result.push(item);
168-
}
197+
var result: any[] = await this.getProviders();
169198
res.setHeader("Content-Type", "application/json");
170199
res.end(JSON.stringify(result));
171200
res.end();
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<script src="main.js"></script>
2+
<script>
3+
function getJSON(url, callback) {
4+
var xhr = new XMLHttpRequest();
5+
xhr.open("GET", url, true);
6+
xhr.responseType = "json";
7+
xhr.onload = function () {
8+
var status = xhr.status;
9+
if (status === 200) {
10+
callback(null, xhr.response);
11+
} else {
12+
callback(status, xhr.response);
13+
}
14+
};
15+
xhr.send();
16+
}
17+
18+
function SettingsController2($scope, $http) {
19+
this.user = null;
20+
this.name = 'John Smith';
21+
// this.domain = "Donald duck";
22+
this.localenabled = false;
23+
this.domain = window.location.hostname;
24+
this.process = function (error, data) {
25+
this.providers = data;
26+
for (var i = this.providers.length - 1; i >= 0; i--) {
27+
if (this.providers[i].provider == "local") {
28+
this.providers.splice(i, 1);
29+
this.localenabled = true;
30+
}
31+
}
32+
if (!$scope.$$phase) { $scope.$apply(); }
33+
};
34+
this.jwt = function (error, data) {
35+
console.log(data);
36+
if (data.user) {
37+
this.user = data.user;
38+
}
39+
if (!$scope.$$phase) { $scope.$apply(); }
40+
};
41+
getJSON("/loginproviders", this.process.bind(this));
42+
43+
getJSON("/jwt", this.jwt.bind(this));
44+
45+
}
46+
angular.module('controllerExample', [])
47+
.controller('SettingsController2', SettingsController2);
48+
SettingsController2.$inject = ['$scope', '$http'];
49+
</script>
50+
51+
<body ng-app="controllerExample">
52+
53+
<div class="starter-template" ng-controller="SettingsController2 as ctrl">
54+
<div class="row" ng-show="ctrl.user == null">
55+
<div class="col-sm-9 col-md-7 col-lg-5 mx-auto">
56+
<div class="card card-signin my-5">
57+
<div class="card-body">
58+
<h5 class="card-title text-center"><span translate lib="web">signin</span> {{ctrl.domain}}</h5>
59+
</h5>
60+
<form class="form-signin" ngNoForm method='post' action='/local'>
61+
<div class="form-label-group" ng-show="ctrl.localenabled">
62+
<input type="text" name="username" ng-model="ctrl.username" class="form-control" placeholder="email"
63+
required autofocus autocomplete='off'>
64+
<label for="username" translate lib="web">email</label>
65+
</div>
66+
<div class="form-label-group" ng-show="ctrl.localenabled">
67+
<input type="password" name="password" ng-model="ctrl.password" class="form-control"
68+
placeholder="Password" required autocomplete="current-password">
69+
<label for="password" translate lib="web">password</label>
70+
</div>
71+
<div class="mb-3">
72+
<label class="text-danger" translate lib="web" ng-model="ctrl.message"></label>
73+
</div>
74+
<button class="btn btn-lg btn-primary btn-block text-uppercase" type="submit" ng-show="ctrl.localenabled"
75+
translate lib="web">signin</button>
76+
<hr class="my-4" ng-show="ctrl.localenabled">
77+
78+
<a ng-href="/{{model.id}}" ng-repeat="model in ctrl.providers"
79+
class="btn btn-lg btn-block text-uppercase">
80+
<i class="fab {{model.logo}} mr-2"></i><span translate lib="web">{{model.name}}</span>
81+
</a>
82+
83+
<div class="card-body" ng-show="ctrl.allow_user_registration==true">
84+
<small><i>
85+
Select a provider or login using a local username and password.
86+
A new user will automaticly be created if username is unknown.
87+
Email validation will be requered to use the core functions.</i></small>
88+
</div>
89+
</form>
90+
</div>
91+
</div>
92+
</div>
93+
</div>
94+
95+
<div class="row" ng-show="ctrl.user != null">
96+
<div class="col-sm-9 col-md-7 col-lg-5 mx-auto">
97+
<div class="card card-signin my-5">
98+
<div class="card-body">
99+
Hello {{ctrl.user.name}}<br>
100+
<a ng-href="/Signout" class="btn btn-lg btn-block text-uppercase">
101+
<i class="fas fa-sign-out-alt"></i>
102+
Singout
103+
</a>
104+
105+
106+
</div>
107+
</div>
108+
</div>
109+
110+
</div>
111+
</div>
112+
</body>

OpenFlowNodeRED/src/dashboardAuth.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,6 @@ export class dashboardAuth {
7373
failureRedirect: '/uisaml/',
7474
failureFlash: false
7575
}));
76-
// app.use("/" + key,
77-
// bodyParser.urlencoded({ extended: false }),
78-
// passport.authenticate(key, { failureRedirect: "/" + key, failureFlash: true }),
79-
// function (req: any, res: any): void {
80-
// var originalUrl2: any = req.cookies.originalUrl2;
81-
// if (originalUrl2 !== undefined && originalUrl2 !== null) {
82-
// res.cookie("originalUrl2", "", { expires: new Date() });
83-
// res.redirect(originalUrl2);
84-
// } else {
85-
// res.redirect("/ui/");
86-
// }
87-
// }
88-
// );
8976
return strategy;
9077
}
9178
}

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.0.343
1+
0.0.344

0 commit comments

Comments
 (0)