Сайт объявлений о работе: Аутентификация пользователя

Оглавление

Sokhavuth TIN ・ Aug 11 ・ 2 min read

GitHub: https://github.com/Sokhavuth/opine-job
Deno Deploy: https://khmerweb-job.deno.dev/users

В веб-фреймворке Opine мы можем использовать множество HTTP методов с различными обработчиками для одного маршрута. Например, для предопределенного маршрута «/users», мы можем использовать HTTP метод запроса GET и POST с различными обработчиками для получения различных результатов. Фактически, мы используем метод HTTP GET для отображения формы входа в браузер, и мы собираемся использовать метод HTTP POST для проверки в базе данных MongoDB, зарегистрирован ли пользователь, который отправил форму входа, или нет. Если он зарегистрирован, мы сохраним его/ее пользовательские данные в базе данных Redis и позволим ему/ей войти в предстоящую приборную панель, в противном случае мы попросим его/ее повторно отправить форму входа с правильным email и паролем.

Более того, для метода HTTP GET, вместо того, чтобы сразу отправлять пользователю форму для входа в систему, мы проверим в базе данных Redis с помощью сессии приложения, зарегистрированы ли данные пользователя или нет. Если данные пользователя зарегистрированы, это означает, что он уже прошел аутентификацию, и мы позволим ему войти в приборную панель без заполнения формы входа.

// routes/users/login.js

import { Router } from "../../deps.ts";
const router = Router();


import login from "../../controllers/users/login.js";

router.get("/", async (req, res) => {
    if(await req.mysession.get("user")){
        res.redirect("/users/post");
    }else{ 
        login.getForm(req, res);
    }
});

router.post("/", (req, res) => {
    login.checkUser(req, res);
});



export default router;
Вход в полноэкранный режим Выход из полноэкранного режима
// controllers/users/login.js

import { bcrypt } from "../../deps.ts";
import login from "../../views/users/login.jsx";
import userdb from "../../models/user.ts";


class Login{
    async getForm(req, res){
        const config = req.mysetting();
        config.page_title = "Login Page";
        config.route = '/users/login';

        const html = await login(config);
        res.send(html);
    }

    async checkUser(req,res){
        const config = await req.mysetting();
        config.page_title = 'Login Page';

        const user = await userdb.checkUser(req);

        if(user){
            if(user.role in {'Admin':1,'Editor':1,'Author':1,"Guest":1}){
                if(await bcrypt.compareSync(req.body.password, user.password)){
                    await req.mysession.set("user", user);
                    res.redirect('/users/post');
                }else{
                    config.message = 'The password is wrong';
                    config.route = '/users';

                    const html = await login(config);
                    res.send(html);
                }
            }else if(user.role in {'Subscriber':1}){
                config.message = 'You are not registered yet';
                config.route = '/users';

                const html = await login(config);
                res.send(html);
            }else{
                config.message = 'You are not registered yet';
                config.route = '/users';

                const html = await login(config);
                res.send(html);
            }
        }else{
            config.message = 'The email is wrong';
            config.route = '/users';

            const html = await login(config);
            res.send(html);
        }
    }
}


export default new Login();
Войти в полноэкранный режим Выход из полноэкранного режима
// models/users.ts

import { bcrypt } from '../deps.ts';


interface UserSchema {
    _id: ObjectId;
    id: string; 
    title: string;
    content: string;
    thumb: string;
    date: string;
    role: string;
    email: string;
    password: string;
}

class User{
    async createRootUser(req){
        const id = Date.now() + Math.round(Math.random() * 1E9).toString();
        const salt = await bcrypt.genSalt(8);
        const hashPassword = bcrypt.hashSync('xxxxxxxxxxx', salt);

        let newUser = {
            id: id, 
            title: 'Guest',
            content: '',
            thumb: '',
            date: '',
            role: 'Guest',
            email: 'guest@khmerweb.app',
            password: hashPassword,
        }

        const users = req.mydb.collection<UserSchema>("users");
        await users.insertOne(newUser);
    }

    async checkUser(req){
        const query = {email:req.body.email}
        const users = req.mydb.collection<UserSchema>("users");
        return await users.findOne(query);
    }
}


export default new User();
Войти в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий