BOKOSCU

GraphicExpressAuthorization

Это очень простая авторизация для вашего сайта. Существует множество опций, которые вы можете настроить.

Использование

Подключите библиотеку как

const GraphicExpressAuthorization = require('graphic-express-authorization');

const users = {
    "Ivan": "PyftimKbNsGenm&"
};
// authorization функция должна возвращать полезную нагрузку с указанием login или null или error для отображения
const {graphicExpressAuthorization, router, identification} = new GraphicExpressAuthorization({
    authorization: function authorization(login, password) { // Функция для верефикации пароля. Может быть async
        if(!users[login]) return null;
        if(users[login] === password) return {login, payload: "123", payload2: "123"};
        return null;
        //or
        return {error: "Не верен логин или пароль"};
    },
    bruteforce:{ // Опционально
        delay: 5000 // Задержка перед следующим вводом пароля, если он оказался не верен
    },
    htmlPath: null, // Путь к твоему собственному HTML. Подробнее ниже
    jwt: {
        privateKey:require('crypto').randomBytes(512).toString("hex"),
        payload: ["payload", "payload2"], // Разрешает эту нагрузку для JWT (Если нет, но будет перезаписана при перевыдаче)
        // publicKey: publicKey, // Публичный ключ для асинхронных методов шифрования
        timeToRecreateToken: 600, //Время которое остаётся после чего, будет выдан новый
        genConfig: { // Конфиг для передачи в JWT включая алогоритмы и время жизни
            algorithm: "HS256",
            expiresIn: '2h'
        }
    },
    cookie: { // Опционально. Настройки куки для токена
        path: '/',
        secure: true,
        httpOnly: true,
        sameSite: 'Strict'
    },
    authPath:"/api/" // Должен быть точно таким-же для express
});

Следующий шаг - подключить роутер к приложению express. Важно, чтобы пути совпадали. (путь аутентификации и путь маршрутизатора api)

const express = require('express');
const app = express();
const cookieParser = require('cookie-parser');

app.use("/api/", router); // Должен быть точно таким-же для GEA

app.get("/enter", cookieParser(), identification, (req,res)=>{ // identification не желателен в глобальном поле ( app.use(identification ))
    res.json({ message: 'WELCOME'});
});
app.listen(3000, () => {
    console.log(
        ` ┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑` + "\n"+
        ` ┝━━┥ Server is started.` + "\n"+
        ` ┝━━┥ http://localhost:3000/enter` + "\n"+
        ` ┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙`
    );
});

Собственный HTML

Если тебе нужно использовать свой собственный HTML-код, то нужно указать путь к HTML-файлу в свойстве htmlPath.

Если решите создать свой собственный html-код, нужно будет подключить authentication.js и нужные идентификаторы.

Подключение authentication.js

  <script src="./authentication.js"></script>

ID должны быть следующими:

#loginButton /* Кнопка входа */
#loginField /* Поле ввода логина ( должен иметь свойство .value ) */
#passwordField /* Поле ввода пароля ( должен иметь свойство .value ) */
#statusField /* Это поле будет меняться в зависимости от статуса входа (в том числе {error}). Опционален. */

Больше примеров:

MySQL

const {graphicExpressAuthorization, router, identification} = new GraphicExpressAuthorization({
    authorization: async function authorization(login, password) {
        const [rows] = await db.query('SELECT * FROM users WHERE login = ?', [login]);
        if(rows.length === 0) return {error: "Такого имени пользователя не найдено"};
        const user = rows[0];
        if(user.password === sha512(password)) return {login};
        return {error: "Пароль не верен"};
    },
    bruteforce:{
        delay: 5000
    },
    jwt: {
        privateKey: require('crypto').randomBytes(512).toString("hex"),
        timeToRecreateToken: 600,
        genConfig: {
            algorithm:"HS256",
            expiresIn: '12h'
        }
    },
    authPath:"/authApi/"
});

app.use("/authApi/", router);

MongoDB

const User = mongoose.model('User');
const {graphicExpressAuthorization, router, identification} = new GraphicExpressAuthorization({
    authorization: async function authorization(login, password) {
        const user = await User.findOne({ login });
        if (!user) return { error: "Такого имени пользователя не найдено" };
        if (user.password === sha512(password)) return { login };
        return { error: "Пароль не верен" };
    },
    bruteforce:{
        delay: 60000
    },
    jwt: {
        privateKey: require('crypto').randomBytes(512).toString("hex"),
        timeToRecreateToken: 600,
        genConfig: {
            algorithm:"HS256",
            expiresIn: '12h'
        }
    },
    authPath:"/api/"
});

app.use("/api/", router);

Теги: Node, JS, Node.js, JavaScript, Web, Express, GUI, UI