@steedos/auth 2.2.52-beta.6 → 2.2.53-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +2 -5
- package/lib/apikey.js +95 -27
- package/lib/apikey.js.map +1 -1
- package/lib/auth-middleware.js +53 -10
- package/lib/auth-middleware.js.map +1 -1
- package/lib/endpoints/jwt.js +122 -61
- package/lib/endpoints/jwt.js.map +1 -1
- package/lib/endpoints/login.js +80 -32
- package/lib/endpoints/login.js.map +1 -1
- package/lib/endpoints/logout.js +44 -6
- package/lib/endpoints/logout.js.map +1 -1
- package/lib/endpoints/validate.js +78 -29
- package/lib/endpoints/validate.js.map +1 -1
- package/lib/express-middleware.js +6 -6
- package/lib/express-middleware.js.map +1 -1
- package/lib/index.js +15 -11
- package/lib/index.js.map +1 -1
- package/lib/session.js +198 -97
- package/lib/session.js.map +1 -1
- package/lib/spaceUserSession.js +330 -106
- package/lib/spaceUserSession.js.map +1 -1
- package/lib/tokenMap.js +84 -27
- package/lib/tokenMap.js.map +1 -1
- package/lib/userSession.js +111 -41
- package/lib/userSession.js.map +1 -1
- package/lib/utils/index.js +92 -31
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/random.js +4 -4
- package/lib/utils/random.js.map +1 -1
- package/package.json +7 -13
package/LICENSE.txt
CHANGED
|
@@ -6,14 +6,11 @@ To determine under which license you may use a file from the Steedos source code
|
|
|
6
6
|
please resort to the header of that file.
|
|
7
7
|
|
|
8
8
|
If the file has no header, the following rules apply
|
|
9
|
-
1.
|
|
10
|
-
2.
|
|
11
|
-
3. source code that is neither (1) nor (2) is licensed under AGPL, see License.AGPL.txt
|
|
9
|
+
1. enterprise features are licensed under Steedos Enterprise Terms, see License.enterprise.txt
|
|
10
|
+
2. source code that is neither (1) is licensed under MIT, see https://opensource.org/licenses/MIT
|
|
12
11
|
|
|
13
12
|
On request, licenses under different terms are available.
|
|
14
13
|
|
|
15
|
-
Project templates can be found in the folders steedos-projects/
|
|
16
|
-
|
|
17
14
|
Source code of enterprise features are files that
|
|
18
15
|
* are in folders named "ee" or start with "ee_", or in subfolders of such folders.
|
|
19
16
|
* contain the strings "ee_" in its filename name.
|
package/lib/apikey.js
CHANGED
|
@@ -1,40 +1,108 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.__esModule = true;
|
|
3
39
|
exports.getAPIKeyAuthHeader = exports.getAPIKey = exports.verifyAPIKey = exports.isAPIKey = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
40
|
+
var objectql_1 = require("@steedos/objectql");
|
|
41
|
+
var HEADER_AUTH = 'Authorization';
|
|
42
|
+
var AUTH_TYPE = 'Bearer';
|
|
7
43
|
function isAPIKey(token) {
|
|
8
44
|
return token.startsWith('apikey,');
|
|
9
45
|
}
|
|
10
46
|
exports.isAPIKey = isAPIKey;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
47
|
+
function verifyAPIKey(token) {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
49
|
+
var apikey, records, record;
|
|
50
|
+
return __generator(this, function (_a) {
|
|
51
|
+
switch (_a.label) {
|
|
52
|
+
case 0:
|
|
53
|
+
if (!isAPIKey(token)) return [3 /*break*/, 3];
|
|
54
|
+
apikey = token.replace('apikey,', '');
|
|
55
|
+
return [4 /*yield*/, (0, objectql_1.getObject)('api_keys').find({ filters: [['api_key', '=', apikey], ['active', '=', true]] })];
|
|
56
|
+
case 1:
|
|
57
|
+
records = _a.sent();
|
|
58
|
+
if (!(records.length > 0)) return [3 /*break*/, 3];
|
|
59
|
+
record = records[0];
|
|
60
|
+
return [4 /*yield*/, (0, objectql_1.getObject)('api_keys').update(record._id, { last_use_time: new Date() })];
|
|
61
|
+
case 2:
|
|
62
|
+
_a.sent();
|
|
63
|
+
return [2 /*return*/, { userId: record.owner, spaceId: record.space }];
|
|
64
|
+
case 3: return [2 /*return*/];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
21
68
|
}
|
|
22
69
|
exports.verifyAPIKey = verifyAPIKey;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return
|
|
27
|
-
|
|
70
|
+
function getAPIKey(spaceId) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
72
|
+
var space;
|
|
73
|
+
return __generator(this, function (_a) {
|
|
74
|
+
switch (_a.label) {
|
|
75
|
+
case 0: return [4 /*yield*/, (0, objectql_1.getObject)('spaces').findOne(spaceId, {})];
|
|
76
|
+
case 1:
|
|
77
|
+
space = _a.sent();
|
|
78
|
+
if (space) {
|
|
79
|
+
return [2 /*return*/, space.api_key];
|
|
80
|
+
}
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
28
85
|
}
|
|
29
86
|
exports.getAPIKey = getAPIKey;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
87
|
+
function getAPIKeyAuthHeader(spaceId) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
89
|
+
var api_key;
|
|
90
|
+
var _a;
|
|
91
|
+
return __generator(this, function (_b) {
|
|
92
|
+
switch (_b.label) {
|
|
93
|
+
case 0: return [4 /*yield*/, getAPIKey(spaceId)];
|
|
94
|
+
case 1:
|
|
95
|
+
api_key = _b.sent();
|
|
96
|
+
if (!api_key) {
|
|
97
|
+
throw new objectql_1.SteedosError('space_apikey_notfind');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return [2 /*return*/, (_a = {}, _a[HEADER_AUTH] = "".concat(AUTH_TYPE, " apikey,").concat(api_key), _a)];
|
|
101
|
+
}
|
|
102
|
+
return [2 /*return*/];
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
38
106
|
}
|
|
39
107
|
exports.getAPIKeyAuthHeader = getAPIKeyAuthHeader;
|
|
40
108
|
//# sourceMappingURL=apikey.js.map
|
package/lib/apikey.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apikey.js","sourceRoot":"","sources":["../src/apikey.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apikey.js","sourceRoot":"","sources":["../src/apikey.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAA4D;AAE5D,IAAM,WAAW,GAAG,eAAe,CAAC;AACpC,IAAM,SAAS,GAAG,QAAQ,CAAC;AAE3B,SAAgB,QAAQ,CAAC,KAAK;IAC1B,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;AACtC,CAAC;AAFD,4BAEC;AAED,SAAsB,YAAY,CAAC,KAAK;;;;;;yBAChC,QAAQ,CAAC,KAAK,CAAC,EAAf,wBAAe;oBACT,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBAC5B,qBAAM,IAAA,oBAAS,EAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAA;;oBAA1G,OAAO,GAAG,SAAgG;yBAC5G,CAAA,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA,EAAlB,wBAAkB;oBACZ,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1B,qBAAM,IAAA,oBAAS,EAAC,UAAU,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,EAAA;;oBAA7E,SAA6E,CAAC;oBAC9E,sBAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,EAAC;;;;;CAGlE;AAVD,oCAUC;AAED,SAAsB,SAAS,CAAC,OAAO;;;;;wBACrB,qBAAM,IAAA,oBAAS,EAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAA;;oBAAtD,KAAK,GAAG,SAA8C;oBAC5D,IAAI,KAAK,EAAE;wBACP,sBAAO,KAAK,CAAC,OAAO,EAAC;qBACxB;;;;;CACJ;AALD,8BAKC;AAED,SAAsB,mBAAmB,CAAC,OAAO;;;;;;wBAC7B,qBAAM,SAAS,CAAC,OAAO,CAAC,EAAA;;oBAAlC,OAAO,GAAG,SAAwB;oBACxC,IAAI,CAAC,OAAO,EAAE;wBACV,MAAM,IAAI,uBAAY,CAAC,sBAAsB,CAAC,CAAC;qBAClD;yBAAI;wBACD,gCAAQ,GAAC,WAAW,IAAG,UAAG,SAAS,qBAAW,OAAO,CAAE,OAAE;qBAC5D;;;;;CACJ;AAPD,kDAOC"}
|
package/lib/auth-middleware.js
CHANGED
|
@@ -1,16 +1,59 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.__esModule = true;
|
|
3
39
|
exports.requireAuthentication = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
40
|
+
var session_1 = require("./session");
|
|
41
|
+
var requireAuthentication = function (req, res, next) { return __awaiter(void 0, void 0, void 0, function () {
|
|
42
|
+
return __generator(this, function (_a) {
|
|
43
|
+
switch (_a.label) {
|
|
44
|
+
case 0: return [4 /*yield*/, (0, session_1.setRequestUser)(req, res, function () {
|
|
45
|
+
if (req.user) {
|
|
46
|
+
next();
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
res.status(401).send({ status: 'error', message: 'You must be logged in to do this.' });
|
|
50
|
+
}
|
|
51
|
+
})];
|
|
52
|
+
case 1:
|
|
53
|
+
_a.sent();
|
|
54
|
+
return [2 /*return*/];
|
|
12
55
|
}
|
|
13
56
|
});
|
|
14
|
-
};
|
|
57
|
+
}); };
|
|
15
58
|
exports.requireAuthentication = requireAuthentication;
|
|
16
59
|
//# sourceMappingURL=auth-middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../src/auth-middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../src/auth-middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAA2C;AAOpC,IAAM,qBAAqB,GAAG,UAAO,GAAY,EAAE,GAAa,EAAE,IAAgB;;;oBACrF,qBAAM,IAAA,wBAAc,EAAC,GAAG,EAAE,GAAG,EAAE;oBAC3B,IAAI,GAAG,CAAC,IAAI,EAAE;wBACV,IAAI,EAAE,CAAC;qBACV;yBACI;wBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;qBAC3F;gBACL,CAAC,CAAC,EAAA;;gBAPF,SAOE,CAAC;;;;KAEN,CAAA;AAVY,QAAA,qBAAqB,yBAUjC"}
|
package/lib/endpoints/jwt.js
CHANGED
|
@@ -1,8 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.__esModule = true;
|
|
3
39
|
exports.jwtSSO = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
40
|
+
var utils_1 = require("../utils");
|
|
41
|
+
var objectql_1 = require("@steedos/objectql");
|
|
6
42
|
// function secretCallback(req, payload, done) {
|
|
7
43
|
// let issuer = payload.iss
|
|
8
44
|
// let collection = getSteedosSchema().getObject('OAuth2Clients')
|
|
@@ -14,65 +50,90 @@ const objectql_1 = require("@steedos/objectql");
|
|
|
14
50
|
// done(reject, '')
|
|
15
51
|
// })
|
|
16
52
|
// }
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
53
|
+
function getTokenInfo(req) {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
55
|
+
var payload, data, userObj, user, userId, authToken, hashedToken, filters, stampedToken, hashedTokenObj;
|
|
56
|
+
return __generator(this, function (_a) {
|
|
57
|
+
switch (_a.label) {
|
|
58
|
+
case 0:
|
|
59
|
+
payload = req.user;
|
|
60
|
+
data = { userId: '', authToken: '' };
|
|
61
|
+
userObj = (0, objectql_1.getSteedosSchema)().getObject('users');
|
|
62
|
+
return [4 /*yield*/, userObj.find({ filters: "username eq '".concat(payload.username, "'"), fields: ['_id'] })];
|
|
63
|
+
case 1:
|
|
64
|
+
user = (_a.sent())[0];
|
|
65
|
+
if (!user) return [3 /*break*/, 5];
|
|
66
|
+
userId = user._id;
|
|
67
|
+
authToken = payload.sessionId ? "".concat(payload.iss, "-").concat(payload.username, "-").concat(payload.sessionId) : "".concat(payload.iss, "-").concat(payload.username);
|
|
68
|
+
hashedToken = (0, utils_1.hashLoginToken)(authToken).replace(/\//g, '%2F');
|
|
69
|
+
filters = "(services/resume/loginTokens/hashedToken eq '".concat(hashedToken, "')");
|
|
70
|
+
return [4 /*yield*/, userObj.count({ filters: filters })];
|
|
71
|
+
case 2:
|
|
72
|
+
if (!_a.sent()) return [3 /*break*/, 3];
|
|
73
|
+
data = { userId: userId, authToken: authToken };
|
|
74
|
+
return [3 /*break*/, 5];
|
|
75
|
+
case 3:
|
|
76
|
+
stampedToken = {
|
|
77
|
+
token: authToken,
|
|
78
|
+
when: new Date
|
|
79
|
+
};
|
|
80
|
+
hashedTokenObj = (0, utils_1.hashStampedToken)(stampedToken);
|
|
81
|
+
return [4 /*yield*/, (0, utils_1.insertHashedLoginToken)(userId, hashedTokenObj)];
|
|
82
|
+
case 4:
|
|
83
|
+
_a.sent();
|
|
84
|
+
data = { userId: userId, authToken: authToken };
|
|
85
|
+
_a.label = 5;
|
|
86
|
+
case 5: return [2 /*return*/, data];
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
41
90
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
91
|
+
var jwtSSO = function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
|
|
92
|
+
var jwt, token, decoded, payload, issuer, collection, clients, clientInfo, secret, spaceId, verifiedPayload, data, redirectUrl, error_1;
|
|
93
|
+
return __generator(this, function (_a) {
|
|
94
|
+
switch (_a.label) {
|
|
95
|
+
case 0:
|
|
96
|
+
_a.trys.push([0, 3, , 4]);
|
|
97
|
+
jwt = require('jsonwebtoken');
|
|
98
|
+
token = req.query.jwt_token;
|
|
99
|
+
if (!token) {
|
|
100
|
+
throw new Error('jwt_token is needed!');
|
|
101
|
+
}
|
|
102
|
+
decoded = jwt.decode(token, { complete: true });
|
|
103
|
+
payload = decoded.payload;
|
|
104
|
+
issuer = payload.iss;
|
|
105
|
+
if (!issuer) {
|
|
106
|
+
throw new Error('issuer is needed!');
|
|
107
|
+
}
|
|
108
|
+
collection = (0, objectql_1.getSteedosSchema)().getObject('OAuth2Clients');
|
|
109
|
+
return [4 /*yield*/, collection.find({ filters: "clientId eq '".concat(issuer, "'") })];
|
|
110
|
+
case 1:
|
|
111
|
+
clients = _a.sent();
|
|
112
|
+
clientInfo = clients[0];
|
|
113
|
+
secret = clientInfo ? clientInfo.clientSecret : '';
|
|
114
|
+
spaceId = clientInfo ? clientInfo.space : '';
|
|
115
|
+
if (!secret) {
|
|
116
|
+
throw new Error('secret is needed!');
|
|
117
|
+
}
|
|
118
|
+
if (!spaceId) {
|
|
119
|
+
throw new Error('spaceId is needed!');
|
|
120
|
+
}
|
|
121
|
+
verifiedPayload = jwt.verify(token, secret);
|
|
122
|
+
return [4 /*yield*/, getTokenInfo({ user: verifiedPayload })];
|
|
123
|
+
case 2:
|
|
124
|
+
data = _a.sent();
|
|
125
|
+
(0, utils_1.setAuthCookies)(req, res, data.userId, data.authToken, spaceId);
|
|
126
|
+
redirectUrl = verifiedPayload.redirect_url;
|
|
127
|
+
res.redirect(302, redirectUrl);
|
|
128
|
+
return [3 /*break*/, 4];
|
|
129
|
+
case 3:
|
|
130
|
+
error_1 = _a.sent();
|
|
131
|
+
console.error(error_1);
|
|
132
|
+
res.status(500).send(error_1.messenger);
|
|
133
|
+
return [3 /*break*/, 4];
|
|
134
|
+
case 4: return [2 /*return*/];
|
|
48
135
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
let issuer = payload.iss;
|
|
52
|
-
if (!issuer) {
|
|
53
|
-
throw new Error('issuer is needed!');
|
|
54
|
-
}
|
|
55
|
-
let collection = (0, objectql_1.getSteedosSchema)().getObject('OAuth2Clients');
|
|
56
|
-
let clients = await collection.find({ filters: `clientId eq '${issuer}'` });
|
|
57
|
-
let clientInfo = clients[0];
|
|
58
|
-
let secret = clientInfo ? clientInfo.clientSecret : '';
|
|
59
|
-
let spaceId = clientInfo ? clientInfo.space : '';
|
|
60
|
-
if (!secret) {
|
|
61
|
-
throw new Error('secret is needed!');
|
|
62
|
-
}
|
|
63
|
-
if (!spaceId) {
|
|
64
|
-
throw new Error('spaceId is needed!');
|
|
65
|
-
}
|
|
66
|
-
let verifiedPayload = jwt.verify(token, secret);
|
|
67
|
-
let data = await getTokenInfo({ user: verifiedPayload });
|
|
68
|
-
(0, utils_1.setAuthCookies)(req, res, data.userId, data.authToken, spaceId);
|
|
69
|
-
let redirectUrl = verifiedPayload.redirect_url;
|
|
70
|
-
res.redirect(302, redirectUrl);
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
console.error(error);
|
|
74
|
-
res.status(500).send(error.messenger);
|
|
75
|
-
}
|
|
76
|
-
};
|
|
136
|
+
});
|
|
137
|
+
}); };
|
|
77
138
|
exports.jwtSSO = jwtSSO;
|
|
78
139
|
//# sourceMappingURL=jwt.js.map
|
package/lib/endpoints/jwt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/endpoints/jwt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/endpoints/jwt.ts"],"names":[],"mappings":"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"}
|
package/lib/endpoints/login.js
CHANGED
|
@@ -1,38 +1,86 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let username = req.body["username"];
|
|
10
|
-
let password = req.body["password"];
|
|
11
|
-
let spaceId = req.body["spaceId"]; // 需要登录的工作区Id,如果不传入,自动选中第一个工作区
|
|
12
|
-
let bcryptPassword = SHA256(password);
|
|
13
|
-
let user = Meteor.users.findOne({
|
|
14
|
-
$or: [{ "username": username }, { "emails.address": username }, { "mobile": username }]
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
9
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
24
36
|
}
|
|
25
|
-
let authtToken = null;
|
|
26
|
-
let stampedAuthToken = (0, utils_1.generateStampedLoginToken)();
|
|
27
|
-
authtToken = stampedAuthToken.token;
|
|
28
|
-
let hashedToken = (0, utils_1.hashStampedToken)(stampedAuthToken);
|
|
29
|
-
await (0, utils_1.insertHashedLoginToken)(user._id, hashedToken);
|
|
30
|
-
let userSession = await (0, session_1.getSession)(authtToken, spaceId);
|
|
31
|
-
// set cookie to response
|
|
32
|
-
// maxAge 3 month
|
|
33
|
-
(0, utils_1.setAuthCookies)(req, res, user._id, authtToken, userSession.spaceId);
|
|
34
|
-
res.setHeader('X-Space-Token', userSession.spaceId + ',' + authtToken);
|
|
35
|
-
return res.send(userSession);
|
|
36
37
|
};
|
|
38
|
+
exports.__esModule = true;
|
|
39
|
+
exports.login = void 0;
|
|
40
|
+
var SHA256 = require("sha256");
|
|
41
|
+
var bcrypt = require('bcryptjs');
|
|
42
|
+
var session_1 = require("../session");
|
|
43
|
+
var utils_1 = require("../utils");
|
|
44
|
+
var login = function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
|
|
45
|
+
var username, password, spaceId, bcryptPassword, user, match, authtToken, stampedAuthToken, hashedToken, userSession;
|
|
46
|
+
return __generator(this, function (_a) {
|
|
47
|
+
switch (_a.label) {
|
|
48
|
+
case 0:
|
|
49
|
+
username = req.body["username"];
|
|
50
|
+
password = req.body["password"];
|
|
51
|
+
spaceId = req.body["spaceId"];
|
|
52
|
+
bcryptPassword = SHA256(password);
|
|
53
|
+
user = Meteor.users.findOne({
|
|
54
|
+
$or: [{ "username": username }, { "emails.address": username }, { "mobile": username }]
|
|
55
|
+
});
|
|
56
|
+
if (!user) {
|
|
57
|
+
res.status(401).send();
|
|
58
|
+
return [2 /*return*/];
|
|
59
|
+
}
|
|
60
|
+
return [4 /*yield*/, bcrypt.compare(bcryptPassword, user.services.password.bcrypt)];
|
|
61
|
+
case 1:
|
|
62
|
+
match = _a.sent();
|
|
63
|
+
if (!match) {
|
|
64
|
+
res.status(401).send();
|
|
65
|
+
return [2 /*return*/];
|
|
66
|
+
}
|
|
67
|
+
authtToken = null;
|
|
68
|
+
stampedAuthToken = (0, utils_1.generateStampedLoginToken)();
|
|
69
|
+
authtToken = stampedAuthToken.token;
|
|
70
|
+
hashedToken = (0, utils_1.hashStampedToken)(stampedAuthToken);
|
|
71
|
+
return [4 /*yield*/, (0, utils_1.insertHashedLoginToken)(user._id, hashedToken)];
|
|
72
|
+
case 2:
|
|
73
|
+
_a.sent();
|
|
74
|
+
return [4 /*yield*/, (0, session_1.getSession)(authtToken, spaceId)];
|
|
75
|
+
case 3:
|
|
76
|
+
userSession = _a.sent();
|
|
77
|
+
// set cookie to response
|
|
78
|
+
// maxAge 3 month
|
|
79
|
+
(0, utils_1.setAuthCookies)(req, res, user._id, authtToken, userSession.spaceId);
|
|
80
|
+
res.setHeader('X-Space-Token', userSession.spaceId + ',' + authtToken);
|
|
81
|
+
return [2 /*return*/, res.send(userSession)];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}); };
|
|
37
85
|
exports.login = login;
|
|
38
86
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/endpoints/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/endpoints/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACjC,IAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACnC,sCAAwC;AACxC,kCAA+G;AAKxG,IAAM,KAAK,GAAG,UAAO,GAAY,EAAE,GAAa;;;;;gBAC/C,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAChC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAChC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAClC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC5B,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;iBAC1F,CAAC,CAAC;gBACH,IAAI,CAAC,IAAI,EAAE;oBACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACvB,sBAAO;iBACV;gBACW,qBAAM,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAA;;gBAA3E,KAAK,GAAG,SAAmE;gBAC/E,IAAI,CAAC,KAAK,EAAE;oBACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACvB,sBAAO;iBACV;gBACG,UAAU,GAAG,IAAI,CAAC;gBAClB,gBAAgB,GAAG,IAAA,iCAAyB,GAAE,CAAC;gBACnD,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC;gBAChC,WAAW,GAAG,IAAA,wBAAgB,EAAC,gBAAgB,CAAC,CAAC;gBACrD,qBAAM,IAAA,8BAAsB,EAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAA;;gBAAnD,SAAmD,CAAC;gBAClC,qBAAM,IAAA,oBAAU,EAAC,UAAU,EAAE,OAAO,CAAC,EAAA;;gBAAnD,WAAW,GAAG,SAAqC;gBACvD,yBAAyB;gBACzB,iBAAiB;gBACjB,IAAA,sBAAc,EAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;gBACpE,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,GAAG,GAAG,GAAG,UAAU,CAAC,CAAC;gBACvE,sBAAO,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAC;;;KAChC,CAAA;AA5BY,QAAA,KAAK,SA4BjB"}
|