serverpreconfigured 1.0.2 → 1.0.3
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/dist/database/models/WSAuth.d.ts +6 -0
- package/dist/database/models/WSAuth.js +17 -0
- package/dist/expressServer.d.ts +2 -0
- package/dist/expressServer.js +8 -2
- package/dist/routes/users.d.ts +2 -0
- package/dist/routes/users.js +80 -0
- package/dist/routes/wsauth.d.ts +1 -0
- package/dist/routes/wsauth.js +45 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +5 -0
- package/dist/users/users.d.ts +1 -0
- package/dist/users/users.js +14 -0
- package/dist/utils/string/random.d.ts +1 -0
- package/dist/utils/string/random.js +13 -0
- package/dist/wsauth/wsauth.d.ts +3 -0
- package/dist/wsauth/wsauth.js +70 -0
- package/migrations/20220320173911-serverpreconfigured-startwsauth.js +40 -0
- package/package.json +1 -1
- package/src/database/models/WSAuth.ts +16 -0
- package/src/expressServer.ts +8 -1
- package/src/routes/{auth.ts → users.ts} +22 -0
- package/src/routes/wsauth.ts +29 -0
- package/src/server.ts +4 -1
- package/src/users/users.ts +10 -0
- package/src/utils/string/random.ts +10 -0
- package/src/wsauth/wsauth.ts +48 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sequelize_1 = require("sequelize");
|
|
4
|
+
const sequelize_2 = require("sequelize");
|
|
5
|
+
class WebSocketAuth extends sequelize_1.Model {
|
|
6
|
+
static init(sequelize) {
|
|
7
|
+
super.init({
|
|
8
|
+
token: sequelize_2.DataTypes.STRING,
|
|
9
|
+
expiration: sequelize_2.DataTypes.DATE,
|
|
10
|
+
user_id: sequelize_2.DataTypes.INTEGER,
|
|
11
|
+
}, {
|
|
12
|
+
sequelize: sequelize,
|
|
13
|
+
tableName: 'spc_wsauth'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.WebSocketAuth = WebSocketAuth;
|
package/dist/expressServer.d.ts
CHANGED
|
@@ -2,9 +2,11 @@ export default class ExpressServer {
|
|
|
2
2
|
app: any;
|
|
3
3
|
authBaseUrl: string;
|
|
4
4
|
usePort: number;
|
|
5
|
+
wsAuthBaseUrl: string;
|
|
5
6
|
constructor();
|
|
6
7
|
listen(port?: any): void;
|
|
7
8
|
initModules(): void;
|
|
8
9
|
initAuthSystem(baseUrl?: string): void;
|
|
10
|
+
initWSAuthSystem(wsBaseUrl?: string): void;
|
|
9
11
|
getApp(): any;
|
|
10
12
|
}
|
package/dist/expressServer.js
CHANGED
|
@@ -8,10 +8,12 @@ const sessions_1 = require("./modules/sessions");
|
|
|
8
8
|
const postreader_1 = require("./modules/postreader");
|
|
9
9
|
const initcors_1 = require("./modules/initcors");
|
|
10
10
|
const env_1 = __importDefault(require("./settings/env"));
|
|
11
|
-
const
|
|
11
|
+
const users_1 = __importDefault(require("./routes/users"));
|
|
12
|
+
const wsauth_1 = require("./routes/wsauth");
|
|
12
13
|
class ExpressServer {
|
|
13
14
|
constructor() {
|
|
14
15
|
this.authBaseUrl = "";
|
|
16
|
+
this.wsAuthBaseUrl = "";
|
|
15
17
|
this.usePort = env_1.default.PORT;
|
|
16
18
|
this.app = express_1.default();
|
|
17
19
|
this.initModules();
|
|
@@ -28,7 +30,11 @@ class ExpressServer {
|
|
|
28
30
|
}
|
|
29
31
|
initAuthSystem(baseUrl = '/user') {
|
|
30
32
|
this.authBaseUrl = baseUrl;
|
|
31
|
-
this.app.use(this.authBaseUrl,
|
|
33
|
+
this.app.use(this.authBaseUrl, users_1.default);
|
|
34
|
+
}
|
|
35
|
+
initWSAuthSystem(wsBaseUrl = '/ws') {
|
|
36
|
+
this.wsAuthBaseUrl = wsBaseUrl;
|
|
37
|
+
this.app.use(this.wsAuthBaseUrl, wsauth_1.router);
|
|
32
38
|
}
|
|
33
39
|
getApp() {
|
|
34
40
|
return this.app;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const express_1 = __importDefault(require("express"));
|
|
16
|
+
const secureset_1 = require("../sessions/secureset");
|
|
17
|
+
const config_1 = require("../auth/config");
|
|
18
|
+
const response_1 = require("../utils/response");
|
|
19
|
+
const auth_1 = require("../auth/auth");
|
|
20
|
+
const meta_sanitizer_1 = __importDefault(require("meta-sanitizer"));
|
|
21
|
+
const users_1 = require("../users/users");
|
|
22
|
+
const users_2 = require("../users/users");
|
|
23
|
+
var LoginErrorCode;
|
|
24
|
+
(function (LoginErrorCode) {
|
|
25
|
+
LoginErrorCode[LoginErrorCode["NoError"] = 0] = "NoError";
|
|
26
|
+
LoginErrorCode[LoginErrorCode["InvalidParams"] = 1] = "InvalidParams";
|
|
27
|
+
LoginErrorCode[LoginErrorCode["InvalidPassword"] = 2] = "InvalidPassword";
|
|
28
|
+
})(LoginErrorCode || (LoginErrorCode = {}));
|
|
29
|
+
var RegisterUserErrorCode;
|
|
30
|
+
(function (RegisterUserErrorCode) {
|
|
31
|
+
RegisterUserErrorCode[RegisterUserErrorCode["NoError"] = 0] = "NoError";
|
|
32
|
+
RegisterUserErrorCode[RegisterUserErrorCode["InvalidParams"] = 1] = "InvalidParams";
|
|
33
|
+
RegisterUserErrorCode[RegisterUserErrorCode["UserExist"] = 2] = "UserExist";
|
|
34
|
+
RegisterUserErrorCode[RegisterUserErrorCode["InternalError"] = 3] = "InternalError";
|
|
35
|
+
})(RegisterUserErrorCode || (RegisterUserErrorCode = {}));
|
|
36
|
+
const router = express_1.default.Router();
|
|
37
|
+
router.post('/logout', (req, res) => {
|
|
38
|
+
let is_ok = false;
|
|
39
|
+
if (auth_1.userIsLogged(req)) {
|
|
40
|
+
secureset_1.deleteSessionValue(req, config_1.SESSION_LOGGED_DATA);
|
|
41
|
+
is_ok = true;
|
|
42
|
+
}
|
|
43
|
+
res.send(response_1.JSONResponse(is_ok, 0, is_ok ? "" : "User Must be logged", {}));
|
|
44
|
+
});
|
|
45
|
+
router.post('/login', (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
46
|
+
let email = "";
|
|
47
|
+
let password = "";
|
|
48
|
+
try {
|
|
49
|
+
email = meta_sanitizer_1.default.sanitizeEmail(req.body.email);
|
|
50
|
+
password = meta_sanitizer_1.default.queryProtector(req.body.password);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return res.send(response_1.JSONResponse(false, LoginErrorCode.InvalidParams, "Must have 'email' and 'password' params"));
|
|
54
|
+
}
|
|
55
|
+
if (password == "" || email == "")
|
|
56
|
+
return res.send(response_1.JSONResponse(false, LoginErrorCode.InvalidParams, "Must have 'email' and 'password' params"));
|
|
57
|
+
const checkPass = yield users_1.checkUserPassword(email, password);
|
|
58
|
+
if (checkPass) {
|
|
59
|
+
secureset_1.setSessionValue(req, config_1.SESSION_LOGGED_DATA, email);
|
|
60
|
+
return res.send(response_1.JSONResponse(true, LoginErrorCode.NoError, "Login Ok"));
|
|
61
|
+
}
|
|
62
|
+
return res.send(response_1.JSONResponse(false, LoginErrorCode.InvalidPassword, "Invalid Password"));
|
|
63
|
+
}));
|
|
64
|
+
router.post('/register', (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
65
|
+
try {
|
|
66
|
+
let email = meta_sanitizer_1.default.sanitizeEmail(req.body.email || '');
|
|
67
|
+
let password = meta_sanitizer_1.default.queryProtector(req.body.password || '');
|
|
68
|
+
let name = meta_sanitizer_1.default.SanitizerEngine(req.body.name || '', true, false, [' ']).sanitizedData;
|
|
69
|
+
if (email == "" || password == "" || name == "")
|
|
70
|
+
return res.send(response_1.JSONResponse(false, RegisterUserErrorCode.InvalidParams, "Invalid params"));
|
|
71
|
+
yield users_2.createUser({ first_name: name, email: email, password_string: password });
|
|
72
|
+
return res.send(response_1.JSONResponse(true, RegisterUserErrorCode.NoError, "", "REGISTER OK"));
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
if (e === "User exist")
|
|
76
|
+
return res.send(response_1.JSONResponse(false, RegisterUserErrorCode.UserExist, "User Exist"));
|
|
77
|
+
return res.send(response_1.JSONResponse(false, RegisterUserErrorCode.InternalError, "I-Error"));
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
exports.default = router;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const router: import("express-serve-static-core").Router;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const express_1 = __importDefault(require("express"));
|
|
16
|
+
const response_1 = require("../utils/response");
|
|
17
|
+
const auth_1 = require("../auth/auth");
|
|
18
|
+
const wsauth_1 = require("../wsauth/wsauth");
|
|
19
|
+
const users_1 = require("../users/users");
|
|
20
|
+
const server_1 = require("../server");
|
|
21
|
+
const config_1 = require("../auth/config");
|
|
22
|
+
exports.router = express_1.default.Router();
|
|
23
|
+
var GenerateTokenError;
|
|
24
|
+
(function (GenerateTokenError) {
|
|
25
|
+
GenerateTokenError[GenerateTokenError["UserMustBeLogged"] = 1] = "UserMustBeLogged";
|
|
26
|
+
GenerateTokenError[GenerateTokenError["GetUserError"] = 2] = "GetUserError";
|
|
27
|
+
GenerateTokenError[GenerateTokenError["InternalError"] = 3] = "InternalError";
|
|
28
|
+
})(GenerateTokenError || (GenerateTokenError = {}));
|
|
29
|
+
;
|
|
30
|
+
exports.router.post('/gettoken', (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
|
+
if (!auth_1.userIsLogged(req))
|
|
32
|
+
return res.send(response_1.JSONResponse(false, GenerateTokenError.UserMustBeLogged, "User Must Be Logged"));
|
|
33
|
+
try {
|
|
34
|
+
let userId = yield users_1.getUserIdByUserEmail(server_1.getSessionValue(req, config_1.SESSION_LOGGED_DATA));
|
|
35
|
+
if (userId == NaN)
|
|
36
|
+
return res.send(response_1.JSONResponse(false, GenerateTokenError.GetUserError, "Get user error"));
|
|
37
|
+
let n = yield wsauth_1.setWSAuthDataNewToken(userId);
|
|
38
|
+
return res.send(response_1.JSONResponse(true, 0, "", { token: n.dataValues.token,
|
|
39
|
+
expiration: n.dataValues.expiration,
|
|
40
|
+
userId: userId
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
}
|
|
45
|
+
}));
|
package/dist/server.d.ts
CHANGED
|
@@ -4,5 +4,7 @@ export { dataBase } from "./database/database";
|
|
|
4
4
|
export { setSessionValue, deleteSessionValue } from "./sessions/secureset";
|
|
5
5
|
export { getSessionValue } from "./sessions/secureget";
|
|
6
6
|
export { checkUserPassword } from "./users/users";
|
|
7
|
+
export { WebSocketAuth } from "./database/models/WSAuth";
|
|
8
|
+
export { checkWSAuthToken } from "./wsauth/wsauth";
|
|
7
9
|
import ExpressServer from "./expressServer";
|
|
8
10
|
export default ExpressServer;
|
package/dist/server.js
CHANGED
|
@@ -17,5 +17,10 @@ var secureget_1 = require("./sessions/secureget");
|
|
|
17
17
|
exports.getSessionValue = secureget_1.getSessionValue;
|
|
18
18
|
var users_1 = require("./users/users");
|
|
19
19
|
exports.checkUserPassword = users_1.checkUserPassword;
|
|
20
|
+
var WSAuth_1 = require("./database/models/WSAuth");
|
|
21
|
+
exports.WebSocketAuth = WSAuth_1.WebSocketAuth;
|
|
22
|
+
var wsauth_1 = require("./wsauth/wsauth");
|
|
23
|
+
exports.checkWSAuthToken = wsauth_1.checkWSAuthToken;
|
|
20
24
|
const expressServer_1 = __importDefault(require("./expressServer"));
|
|
21
25
|
exports.default = expressServer_1.default;
|
|
26
|
+
const e = new expressServer_1.default();
|
package/dist/users/users.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { UserCreateInterface } from "./types";
|
|
2
2
|
export declare function getUserById(id: Number): Promise<any>;
|
|
3
3
|
export declare function getUserByEmail(email: string): Promise<any>;
|
|
4
|
+
export declare function getUserIdByUserEmail(email: string): Promise<number>;
|
|
4
5
|
export declare function deleteUserById(id: Number): Promise<any>;
|
|
5
6
|
export declare function isUserExist(email: string): Promise<boolean>;
|
|
6
7
|
export declare function createUser(data: UserCreateInterface): Promise<any>;
|
package/dist/users/users.js
CHANGED
|
@@ -27,6 +27,20 @@ function getUserByEmail(email) {
|
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
exports.getUserByEmail = getUserByEmail;
|
|
30
|
+
function getUserIdByUserEmail(email) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
try {
|
|
33
|
+
let u = yield getUserByEmail(email);
|
|
34
|
+
if (u == null || u == undefined)
|
|
35
|
+
return NaN;
|
|
36
|
+
return u.dataValues.id;
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
return NaN;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
exports.getUserIdByUserEmail = getUserIdByUserEmail;
|
|
30
44
|
function deleteUserById(id) {
|
|
31
45
|
return __awaiter(this, void 0, void 0, function* () {
|
|
32
46
|
let result = yield User_1.User.destroy({ where: { id: id.toString() } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function randomString(length: number): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function randomString(length) {
|
|
4
|
+
var result = '';
|
|
5
|
+
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
6
|
+
var charactersLength = characters.length;
|
|
7
|
+
for (var i = 0; i < length; i++) {
|
|
8
|
+
result += characters.charAt(Math.floor(Math.random() *
|
|
9
|
+
charactersLength));
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
exports.randomString = randomString;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const server_1 = require("../server");
|
|
13
|
+
const server_2 = require("../server");
|
|
14
|
+
const random_1 = require("./../utils/string/random");
|
|
15
|
+
server_1.WebSocketAuth.init(server_2.dataBase);
|
|
16
|
+
function getWSAuthDataByUserId(userId) {
|
|
17
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
try {
|
|
19
|
+
let u = yield server_1.WebSocketAuth.findOne({ where: { user_id: userId.toString() } });
|
|
20
|
+
return u;
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
throw e;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
exports.getWSAuthDataByUserId = getWSAuthDataByUserId;
|
|
28
|
+
function setWSAuthDataNewToken(userId, expiration_hours = 72) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
try {
|
|
31
|
+
let ws = yield getWSAuthDataByUserId(userId);
|
|
32
|
+
let token = random_1.randomString(50);
|
|
33
|
+
let expiration = new Date();
|
|
34
|
+
expiration.setTime(expiration.getTime() + expiration_hours * 60 * 60 * 1000);
|
|
35
|
+
if (ws == null || ws == undefined) {
|
|
36
|
+
return yield server_1.WebSocketAuth.create({ user_id: userId.toString(),
|
|
37
|
+
token: token,
|
|
38
|
+
expiration: expiration,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
ws.token = token;
|
|
43
|
+
ws.expiration = expiration;
|
|
44
|
+
return yield ws.save();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
throw e;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
exports.setWSAuthDataNewToken = setWSAuthDataNewToken;
|
|
53
|
+
function checkWSAuthToken(userId, token) {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
try {
|
|
56
|
+
let ws = yield getWSAuthDataByUserId(userId);
|
|
57
|
+
if (!Boolean(ws))
|
|
58
|
+
return false;
|
|
59
|
+
if (ws.dataValues.token != token)
|
|
60
|
+
return false;
|
|
61
|
+
if (Date.now() > ws.dataValues.expiration.getTime())
|
|
62
|
+
return false;
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
exports.checkWSAuthToken = checkWSAuthToken;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
async up (queryInterface, Sequelize) {
|
|
5
|
+
return await queryInterface.createTable('spc_wsauth',
|
|
6
|
+
{ id: {
|
|
7
|
+
type:Sequelize.INTEGER,
|
|
8
|
+
primaryKey:true,
|
|
9
|
+
autoIncrement:true,
|
|
10
|
+
allowNull:false
|
|
11
|
+
} ,
|
|
12
|
+
user_id:{
|
|
13
|
+
type:Sequelize.INTEGER,
|
|
14
|
+
references:{model:'spc_users',key:'id'}
|
|
15
|
+
},
|
|
16
|
+
token:{
|
|
17
|
+
type:Sequelize.STRING,
|
|
18
|
+
allowNull:false,
|
|
19
|
+
},
|
|
20
|
+
expiration:{
|
|
21
|
+
type:Sequelize.DATE,
|
|
22
|
+
allowNull:false,
|
|
23
|
+
},
|
|
24
|
+
created_at:{
|
|
25
|
+
type:Sequelize.DATE,
|
|
26
|
+
allowNull:false,
|
|
27
|
+
},
|
|
28
|
+
updated_at:{
|
|
29
|
+
type:Sequelize.DATE,
|
|
30
|
+
allowNull:false,
|
|
31
|
+
},
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
);
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
async down (queryInterface, Sequelize) {
|
|
38
|
+
return await queryInterface.dropTable('spc_wsauth');
|
|
39
|
+
}
|
|
40
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "serverpreconfigured",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "\"Pre-configured server with authentication system and database integration\"",
|
|
5
5
|
"main": "dist/server.js",
|
|
6
6
|
"keywords": ["server","pre configured","database","authentication"],
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Model } from "sequelize";
|
|
2
|
+
import { DataTypes } from "sequelize";
|
|
3
|
+
export class WebSocketAuth extends Model{
|
|
4
|
+
declare token:string;
|
|
5
|
+
declare expiration:Date;
|
|
6
|
+
static init(sequelize:any){
|
|
7
|
+
super.init({
|
|
8
|
+
token:DataTypes.STRING,
|
|
9
|
+
expiration:DataTypes.DATE,
|
|
10
|
+
user_id:DataTypes.INTEGER,
|
|
11
|
+
},{
|
|
12
|
+
sequelize:sequelize,
|
|
13
|
+
tableName:'spc_wsauth'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/expressServer.ts
CHANGED
|
@@ -3,13 +3,16 @@ import { initSessions } from "./modules/sessions";
|
|
|
3
3
|
import { initPostReader } from "./modules/postreader";
|
|
4
4
|
import { initCors } from "./modules/initcors";
|
|
5
5
|
import ENV from "./settings/env";
|
|
6
|
-
import authRouter from "./routes/
|
|
6
|
+
import authRouter from "./routes/users";
|
|
7
|
+
import { router as wsAuthRoter } from "./routes/wsauth";
|
|
7
8
|
export default class ExpressServer{
|
|
8
9
|
app:any;
|
|
9
10
|
authBaseUrl:string;
|
|
10
11
|
usePort:number;
|
|
12
|
+
wsAuthBaseUrl:string;
|
|
11
13
|
constructor(){
|
|
12
14
|
this.authBaseUrl="";
|
|
15
|
+
this.wsAuthBaseUrl="";
|
|
13
16
|
this.usePort=ENV.PORT;
|
|
14
17
|
this.app=express();
|
|
15
18
|
this.initModules();
|
|
@@ -29,6 +32,10 @@ export default class ExpressServer{
|
|
|
29
32
|
this.authBaseUrl=baseUrl;
|
|
30
33
|
this.app.use(this.authBaseUrl,authRouter);
|
|
31
34
|
}
|
|
35
|
+
initWSAuthSystem(wsBaseUrl:string='/ws'){
|
|
36
|
+
this.wsAuthBaseUrl=wsBaseUrl;
|
|
37
|
+
this.app.use(this.wsAuthBaseUrl,wsAuthRoter);
|
|
38
|
+
}
|
|
32
39
|
|
|
33
40
|
getApp(){
|
|
34
41
|
return this.app;
|
|
@@ -5,12 +5,19 @@ import { JSONResponse } from "../utils/response";
|
|
|
5
5
|
import { userIsLogged } from "../auth/auth";
|
|
6
6
|
import meta_sanitizer from 'meta-sanitizer';
|
|
7
7
|
import { checkUserPassword } from "../users/users";
|
|
8
|
+
import { createUser } from "../users/users";
|
|
8
9
|
enum LoginErrorCode{
|
|
9
10
|
NoError=0,
|
|
10
11
|
InvalidParams,
|
|
11
12
|
InvalidPassword,
|
|
12
13
|
|
|
13
14
|
}
|
|
15
|
+
enum RegisterUserErrorCode{
|
|
16
|
+
NoError=0,
|
|
17
|
+
InvalidParams,
|
|
18
|
+
UserExist,
|
|
19
|
+
InternalError
|
|
20
|
+
}
|
|
14
21
|
const router=express.Router();
|
|
15
22
|
router.post('/logout',(req,res)=>{
|
|
16
23
|
let is_ok=false;
|
|
@@ -38,5 +45,20 @@ router.post('/login',async (req,res)=>{
|
|
|
38
45
|
}
|
|
39
46
|
return res.send(JSONResponse(false,LoginErrorCode.InvalidPassword,"Invalid Password"));
|
|
40
47
|
});
|
|
48
|
+
router.post('/register',async (req,res)=>{
|
|
49
|
+
try{
|
|
50
|
+
let email=meta_sanitizer.sanitizeEmail(req.body.email||'');
|
|
51
|
+
let password=meta_sanitizer.queryProtector(req.body.password||'');
|
|
52
|
+
let name=meta_sanitizer.SanitizerEngine(req.body.name||'',true,false,[' ']).sanitizedData;
|
|
53
|
+
if(email=="" || password=="" || name=="")
|
|
54
|
+
return res.send(JSONResponse(false,RegisterUserErrorCode.InvalidParams,"Invalid params"));
|
|
55
|
+
await createUser({first_name:name,email:email,password_string:password});
|
|
56
|
+
return res.send(JSONResponse(true,RegisterUserErrorCode.NoError,"","REGISTER OK"));
|
|
57
|
+
}catch(e){
|
|
58
|
+
if(e==="User exist")
|
|
59
|
+
return res.send(JSONResponse(false,RegisterUserErrorCode.UserExist,"User Exist"));
|
|
60
|
+
return res.send(JSONResponse(false,RegisterUserErrorCode.InternalError,"I-Error"));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
41
63
|
|
|
42
64
|
export default router;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { JSONResponse } from "../utils/response";
|
|
3
|
+
import { userIsLogged } from "../auth/auth";
|
|
4
|
+
import { setWSAuthDataNewToken } from "../wsauth/wsauth";
|
|
5
|
+
import { getUserIdByUserEmail } from "../users/users";
|
|
6
|
+
import { getSessionValue } from "../server";
|
|
7
|
+
import { SESSION_LOGGED_DATA } from "../auth/config";
|
|
8
|
+
export const router=express.Router();
|
|
9
|
+
enum GenerateTokenError{
|
|
10
|
+
UserMustBeLogged=1,
|
|
11
|
+
GetUserError,
|
|
12
|
+
InternalError,
|
|
13
|
+
};
|
|
14
|
+
router.post('/gettoken',async (req,res)=>{
|
|
15
|
+
if(!userIsLogged(req))
|
|
16
|
+
return res.send(JSONResponse(false,GenerateTokenError.UserMustBeLogged,"User Must Be Logged"));
|
|
17
|
+
try{
|
|
18
|
+
let userId=await getUserIdByUserEmail(getSessionValue(req,SESSION_LOGGED_DATA));
|
|
19
|
+
if(userId==NaN)
|
|
20
|
+
return res.send(JSONResponse(false,GenerateTokenError.GetUserError,"Get user error"));
|
|
21
|
+
let n=await setWSAuthDataNewToken(userId);
|
|
22
|
+
return res.send(JSONResponse(true,0,"",{token:n.dataValues.token,
|
|
23
|
+
expiration:n.dataValues.expiration,
|
|
24
|
+
userId:userId
|
|
25
|
+
}));
|
|
26
|
+
}catch(e){
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
});
|
package/src/server.ts
CHANGED
|
@@ -4,5 +4,8 @@ export { dataBase } from "./database/database";
|
|
|
4
4
|
export { setSessionValue,deleteSessionValue } from "./sessions/secureset";
|
|
5
5
|
export { getSessionValue } from "./sessions/secureget";
|
|
6
6
|
export { checkUserPassword } from "./users/users";
|
|
7
|
+
export { WebSocketAuth } from "./database/models/WSAuth";
|
|
8
|
+
export { checkWSAuthToken } from "./wsauth/wsauth";
|
|
7
9
|
import ExpressServer from "./expressServer";
|
|
8
|
-
export default ExpressServer;
|
|
10
|
+
export default ExpressServer;
|
|
11
|
+
const e=new ExpressServer();
|
package/src/users/users.ts
CHANGED
|
@@ -12,6 +12,16 @@ export async function getUserByEmail(email:string){
|
|
|
12
12
|
let result=await User.findOne({where:{email:email}});
|
|
13
13
|
return (result);
|
|
14
14
|
}
|
|
15
|
+
export async function getUserIdByUserEmail(email:string):Promise<number>{
|
|
16
|
+
try{
|
|
17
|
+
let u=await getUserByEmail(email);
|
|
18
|
+
if(u==null || u==undefined)
|
|
19
|
+
return NaN;
|
|
20
|
+
return u.dataValues.id;
|
|
21
|
+
}catch(e){
|
|
22
|
+
return NaN;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
15
25
|
|
|
16
26
|
export async function deleteUserById(id:Number){
|
|
17
27
|
let result=await User.destroy({where:{id:id.toString()}});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function randomString(length:number):string {
|
|
2
|
+
var result = '';
|
|
3
|
+
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
4
|
+
var charactersLength = characters.length;
|
|
5
|
+
for ( var i = 0; i < length; i++ ) {
|
|
6
|
+
result += characters.charAt(Math.floor(Math.random() *
|
|
7
|
+
charactersLength));
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { WebSocketAuth } from "../server";
|
|
2
|
+
import { dataBase } from "../server";
|
|
3
|
+
import {randomString} from "./../utils/string/random";
|
|
4
|
+
WebSocketAuth.init(dataBase);
|
|
5
|
+
export async function getWSAuthDataByUserId(userId:number){
|
|
6
|
+
try{
|
|
7
|
+
let u=await WebSocketAuth.findOne({where:{user_id:userId.toString()}});
|
|
8
|
+
return u;
|
|
9
|
+
}catch(e){
|
|
10
|
+
throw e;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function setWSAuthDataNewToken(userId:number,expiration_hours:number=72){
|
|
15
|
+
try{
|
|
16
|
+
let ws=await getWSAuthDataByUserId(userId);
|
|
17
|
+
let token=randomString(50);
|
|
18
|
+
let expiration=new Date();
|
|
19
|
+
expiration.setTime(expiration.getTime()+expiration_hours*60*60*1000);
|
|
20
|
+
if(ws==null || ws==undefined){
|
|
21
|
+
return await WebSocketAuth.create({user_id:userId.toString(),
|
|
22
|
+
token:token,
|
|
23
|
+
expiration:expiration,
|
|
24
|
+
});
|
|
25
|
+
}else{
|
|
26
|
+
ws.token=token;
|
|
27
|
+
ws.expiration=expiration;
|
|
28
|
+
return await ws.save();
|
|
29
|
+
}
|
|
30
|
+
}catch(e){
|
|
31
|
+
throw e;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function checkWSAuthToken(userId:number,token:string):Promise<boolean>{
|
|
36
|
+
try{
|
|
37
|
+
let ws=await getWSAuthDataByUserId(userId);
|
|
38
|
+
if(!Boolean(ws))
|
|
39
|
+
return false;
|
|
40
|
+
if(ws.dataValues.token!=token)
|
|
41
|
+
return false;
|
|
42
|
+
if(Date.now()>ws.dataValues.expiration.getTime())
|
|
43
|
+
return false;
|
|
44
|
+
return true;
|
|
45
|
+
}catch(e){
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|