summaryrefslogtreecommitdiff
path: root/build/core/Authentication.js
blob: d0606f6a900695616d4a9a2af5932b321dfc49b8 (plain)
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