1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const AutoreportBase_1 = __importDefault(require("./AutoreportBase"));
const axios_1 = __importDefault(require("axios"));
const node_fs_1 = require("node:fs");
const crypto_1 = require("crypto");
class Authentication extends AutoreportBase_1.default {
static getToken(token) {
let tokens = JSON.parse((0, node_fs_1.readFileSync)(AutoreportBase_1.default.getRoot() + "/data/tokens.json").toString());
if (Object.keys(tokens).includes(token) && new Date(tokens[token].date).getTime() - new Date().getTime() <= 31000000) {
return tokens[token].info;
}
else {
return false;
}
}
static saveToken(userInfo) {
let tokens = JSON.parse((0, node_fs_1.readFileSync)(AutoreportBase_1.default.getRoot() + "/data/tokens.json").toString());
let token = (0, crypto_1.randomBytes)(64).toString("base64url");
tokens[token] = {
date: new Date().getTime(),
info: userInfo
};
(0, node_fs_1.writeFileSync)(AutoreportBase_1.default.getRoot() + "/data/tokens.json", JSON.stringify(tokens));
return token;
}
static startFlow(req, res) {
res.redirect(`${AutoreportBase_1.default.config.authentication.server}/api/rest/oauth2/auth?client_id=${AutoreportBase_1.default.config.authentication.id}&response_type=code&redirect_uri=${AutoreportBase_1.default.config.authentication.redirect}&scope=Hub&request_credentials=default&access_type=offline`);
}
static checkAuthentication(req) {
let _cookies = req.headers.cookie ?? "";
let _tokens = _cookies.split(";").map(i => i.trim().split("=")).filter(i => i[0] === "AutoreportToken");
let __tokens = _tokens[0] ?? [];
let token = __tokens[1] ?? null;
return !(!token || !this.getToken(token));
}
static async callback(req, res) {
if (!req.query.code) {
res.redirect("/");
}
let token = (await axios_1.default.post(`${AutoreportBase_1.default.config.authentication.server}/api/rest/oauth2/token`, `grant_type=authorization_code&redirect_uri=${encodeURIComponent(AutoreportBase_1.default.config.authentication.redirect)}&code=${req.query.code}`, {
headers: {
'Authorization': `Basic ${Buffer.from(`${AutoreportBase_1.default.config.authentication.id}:${AutoreportBase_1.default.config.authentication.secret}`).toString("base64")}`,
'Accept': "application/json",
'Content-Type': "application/x-www-form-urlencoded"
}
})).data.access_token;
let userInfo = (await axios_1.default.get(`${AutoreportBase_1.default.config.authentication.server}/api/rest/users/me`, {
headers: {
'Authorization': `Bearer ${token}`,
'Accept': "application/json"
}
})).data;
let userToken = Authentication.saveToken(userInfo);
res.cookie('AutoreportToken', userToken, { maxAge: 31000000, httpOnly: true });
res.redirect("/");
}
static testEndpoint(req, res) {
if (Authentication.checkAuthentication(req)) {
res.send("Authenticated");
}
else {
res.send("NOT authenticated");
}
}
static protectedAPI(req, res, next) {
if ([null, undefined, ""].includes(req.get("authorization"))) {
return res.status(401).json({
code: 401,
message: "Please provide an Authorization header."
});
}
if (req.get("authorization") !== AutoreportBase_1.default.config.api.token) {
return res.status(403).json({
code: 403,
message: "You do not have permission to use this endpoint."
});
}
next();
}
}
exports.default = Authentication;
//# sourceMappingURL=Authentication.js.map
|