Skip to content

Commit b02a9a7

Browse files
committed
add static login for robot embedding
1 parent 3b3c109 commit b02a9a7

3 files changed

Lines changed: 76 additions & 17 deletions

File tree

OpenFlow/src/LoginProvider.ts

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,18 @@ export class LoginProvider {
6262
private static _providers: any = {};
6363
private static login_providers: Provider[] = [];
6464

65+
public static redirect(res: any, originalUrl: string) {
66+
res.write('<!DOCTYPE html>');
67+
res.write('<body>');
68+
res.write('<script>top.location = "' + originalUrl + '";</script>');
69+
// res.write('<a href="' + originalUrl + '">click here</a>');
70+
res.write('</body>');
71+
res.write('</html>');
72+
res.end();
73+
// res.redirect(originalUrl);
74+
}
75+
76+
6577
static async validateToken(rawAssertion: string): Promise<User> {
6678
return new Promise<User>((resolve, reject) => {
6779
var options = {
@@ -123,16 +135,35 @@ export class LoginProvider {
123135
// Audit.LoginSuccess(new TokenUser(user), "weblogin", "cookie", "");
124136
});
125137

138+
app.use(function (req, res, next) {
139+
res.header('Access-Control-Allow-Origin', (req.headers.origin as any));
140+
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
141+
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
142+
res.header('Expires', '-1');
143+
res.header('Pragma', 'no-cache');
144+
next();
145+
});
146+
126147
app.get("/Signout", (req: any, res: any, next: any): void => {
127148
req.logout();
128149
var originalUrl: any = req.cookies.originalUrl;
129150
if (!Util.IsNullEmpty(originalUrl)) {
130-
res.cookie("originalUrl", "", { expires: new Date() });
131-
res.redirect(originalUrl);
151+
res.cookie("originalUrl", "", { expires: new Date(0) });
152+
LoginProvider.redirect(res, originalUrl);
132153
} else {
133154
res.redirect("/");
134155
}
135156
});
157+
app.get("/PassiveSignout", (req: any, res: any, next: any): void => {
158+
req.logout();
159+
var originalUrl: any = req.cookies.originalUrl;
160+
if (!Util.IsNullEmpty(originalUrl)) {
161+
res.cookie("originalUrl", "", { expires: new Date(0) });
162+
LoginProvider.redirect(res, originalUrl);
163+
} else {
164+
res.redirect("/Login");
165+
}
166+
});
136167
await LoginProvider.RegisterProviders(app, baseurl);
137168
app.get("/jwt", (req: any, res: any, next: any): void => {
138169
res.setHeader("Content-Type", "application/json");
@@ -144,6 +175,16 @@ export class LoginProvider {
144175
}
145176
res.end();
146177
});
178+
app.get("/jwtlong", (req: any, res: any, next: any): void => {
179+
res.setHeader("Content-Type", "application/json");
180+
if (req.user) {
181+
var user: TokenUser = new TokenUser(req.user);
182+
res.end(JSON.stringify({ jwt: Crypt.createToken(user, "365d"), user: user }));
183+
} else {
184+
res.end(JSON.stringify({ jwt: "" }));
185+
}
186+
res.end();
187+
});
147188
app.post("/jwt", async (req: any, res: any, next: any): Promise<void> => {
148189
try {
149190
var rawAssertion = req.body.token;
@@ -256,8 +297,8 @@ export class LoginProvider {
256297
function (req: any, res: any): void {
257298
var originalUrl: any = req.cookies.originalUrl;
258299
if (!Util.IsNullEmpty(originalUrl)) {
259-
res.cookie("originalUrl", "", { expires: new Date() });
260-
res.redirect(originalUrl);
300+
res.cookie("originalUrl", "", { expires: new Date(0) });
301+
LoginProvider.redirect(res, originalUrl);
261302
} else {
262303
res.redirect("/");
263304
}
@@ -341,8 +382,8 @@ export class LoginProvider {
341382
function (req: any, res: any): void {
342383
var originalUrl: any = req.cookies.originalUrl;
343384
if (!Util.IsNullEmpty(originalUrl)) {
344-
res.cookie("originalUrl", "", { expires: new Date() });
345-
res.redirect(originalUrl);
385+
res.cookie("originalUrl", "", { expires: new Date(0) });
386+
LoginProvider.redirect(res, originalUrl);
346387
} else {
347388
res.redirect("/");
348389
}
@@ -401,15 +442,16 @@ export class LoginProvider {
401442
}
402443
});
403444
passport.use("local", strategy);
445+
// http://www.passportjs.org/docs/authenticate/#custom-callback
404446
app.use("/local",
405447
bodyParser.urlencoded({ extended: false }),
406448
//passport.authenticate("local", { failureRedirect: "/login?failed=true", failureFlash: true }),
407449
passport.authenticate("local", { failureRedirect: "/" }),
408450
function (req: any, res: any): void {
409451
var originalUrl: any = req.cookies.originalUrl;
410452
if (!Util.IsNullEmpty(originalUrl)) {
411-
res.cookie("originalUrl", "", { expires: new Date() });
412-
res.redirect(originalUrl);
453+
res.cookie("originalUrl", "", { expires: new Date(0) });
454+
LoginProvider.redirect(res, originalUrl);
413455
} else {
414456
res.redirect("/");
415457
}

OpenFlow/src/public/PassiveLogin.html

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
1-
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
2-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.10.2/css/all.css"
3-
integrity="sha256-piqEf7Ap7CMps8krDQsSOTZgF+MU/0MPyPW2enj5I40=" crossorigin="anonymous" />
1+
<!DOCTYPE html>
2+
<html lang="en">
43

5-
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
6-
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
4+
<head>
5+
<meta charset="utf-8">
6+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7+
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
9+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.10.2/css/all.css"
10+
integrity="sha256-piqEf7Ap7CMps8krDQsSOTZgF+MU/0MPyPW2enj5I40=" crossorigin="anonymous" />
11+
12+
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
13+
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
14+
15+
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
16+
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
17+
</head>
718

819
<script>
920
function getJSON(url, callback) {
@@ -13,7 +24,11 @@
1324
xhr.onload = function () {
1425
var status = xhr.status;
1526
if (status === 200) {
16-
callback(null, xhr.response);
27+
var data = xhr.response;
28+
if (typeof data === "string" || data instanceof String) {
29+
data = JSON.parse(data);
30+
}
31+
callback(null, data);
1732
} else {
1833
callback(status, xhr.response);
1934
}
@@ -28,6 +43,7 @@
2843
this.localenabled = false;
2944
this.domain = window.location.hostname;
3045
this.process = function (error, data) {
46+
console.log(data);
3147
this.providers = data;
3248
for (var i = this.providers.length - 1; i >= 0; i--) {
3349
if (this.providers[i].provider == "local") {
@@ -41,10 +57,11 @@
4157
console.log(data);
4258
if (data.user) {
4359
this.user = data.user;
60+
} else {
61+
getJSON("/loginproviders", this.process.bind(this));
4462
}
4563
if (!$scope.$$phase) { $scope.$apply(); }
4664
};
47-
getJSON("/loginproviders", this.process.bind(this));
4865

4966
getJSON("/jwt", this.jwt.bind(this));
5067

@@ -81,7 +98,7 @@ <h5 class="card-title text-center"><span translate lib="web">signin</span> {{ctr
8198
translate lib="web">signin</button>
8299
<hr class="my-4" ng-show="ctrl.localenabled">
83100

84-
<a ng-href="/{{model.id}}" ng-repeat="model in ctrl.providers"
101+
<a ng-href="/{{model.id}}" ng-repeat="model in ctrl.providers track by $index"
85102
class="btn btn-lg btn-block text-uppercase">
86103
<i class="fab {{model.logo}} mr-2"></i><span translate lib="web">{{model.name}}</span>
87104
</a>

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.0.345
1+
0.0.346

0 commit comments

Comments
 (0)