
Оглавление
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();