Этот скрипт является продолжением сайта на NodeJS, если вы не проходили его, возможно вам будет сложнее понять смысл этого скрипта.
Итак, в этом скрипте мы научимся создавать регистрацию на NodeJS
Для начала проверьте наличие NodeJS на вашем компьютере. Если нет, установите.
Далее в удобной для вас папке создайте файл app.js и users.json
В качестве текстового редактора будем использовать VSCode.
Пока откройте users.json и впишите туда
[]
Это будет массивом объектов, 1 объект - 1 пользователь.
Теперь как обычно нужно зайти в app.js и подключить нужные модули. В отличии от первого гайда, здесь мы подключим сразу 4 модуля (кроме стандартных).
Через консоль Windows (cmd) зайдите в папку с app.js и users.json и введите туда эти команды
npm install express
npm install sha256
npm install socket.io
npm install fs
для установки нужных модулей.
express - для использования nodejs как сервера
sha256 - для хэша
socket.io - для запросов на сервер со стороны клиента
fs - для работы с файлами
Конечно, при регистрации ещё можно отправлять письмо с подтверждением, а в нем ссылка на подтверждение почты, но это в отдельном скрипте, чтобы не забивать голову.
Итак, подключаем нужные модули в файле app.js
const express = require("express");
const { createServer } = require("node:http");
const { SocketAddress } = require("node:net");
const { join } = require("node:path");
const { Server } = require("socket.io");
const app = express();
const server = createServer(app);
const io = new Server(server);
const sha256 = require("sha256");
const fs = require("fs");
const { stringify } = require("node:querystring");
Теперь добавим ссылку на наш файл register.html
app.get("/register", (req, res) => {
res.sendFile(join(__dirname, "register.html"));
});
И не забудем написать в конце порт для сервера
server.listen(80, () => {
console.log("server running at http://localhost");
});
Теперь создадим файл register.html по соседству с app.js и создадим в нем 4 поля и кнопку
Сначала естественно напишем стилей
<head>
<style>
#myForm{
width: 30%;
margin: 10% 0 0 35%;
}
#myForm>p>input{
width: 90%;
padding: 7px;
}
</style>
</head>
Теперь в body создаем импровизированную форму с 4 input и одной кнопкой. Обернем их тегом p для стиля
<body>
<div id="myForm">
<p><input id="login" type="text" placeholder="Login"></p>
<p><input id="password" type="password" placeholder="Password"></p>
<p><input id="password2" type="password" placeholder="Password again"></p>
<p><input id="email" type="email" placeholder="Email"></p>
<button id="btn">Регистрация</button>
</div>
Теперь подключаем socket.io, как отдельный скрипт, и запишем в переменные наши 4 input'а
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
const login = document.getElementById("login");
const password = document.getElementById("password");
const password2 = document.getElementById("password2");
const email = document.getElementById("email");
const btn = document.getElementById("btn");
Теперь самое интересное. При подключении клиента к серверу нужно написать event handler для кнопки. Когда она будет нажата, мы передадим наши переменные через функцию
//socket.emit("команда", arg1, arg2, arg3...);
socket.on('connect', ()=>{
btn.addEventListener('click', ()=>{
socket.emit("register", login.value, password.value, password2.value, email.value);
}
......
Все вводимые данные пользователем проверяются СТРОГО на стороне сервера и НИКОГДА на стороне клиента.
Заранее пропишем инструкцию получения списка ошибок и успешного выполнения. Пропишем их в консоль.
socket.on('errors', (errors)=>{
console.log("Ошибки: ");
console.log(errors);
});
socket.on('success', ()=>{
console.log("Успешно");
});
)};
Отлично, теперь переходим к серверу.
До метода
server.listen(80, () => {
.....
Пишем следующее
io.on("connection", (socket)=>{
});
Внутри пишем функцию принятия, проверки и обработки данных по команде "register"
socket.on("register", (login, pswrd, pswrd2, email)=>{
}
Внутри этой функции пишем все, что будет далее. Считываем данные из файла в список Users
data = fs.readFileSync("./users.json", "utf8");
Users = JSON.parse(data);
Создаем список ошибок, куда будем добавлять потенциальные ошибки
errors = [];
Переводим логин и email в нижний регистр. Проверяем, есть ли пустые поля.
login = login.toLowerCase();
email = email.toLowerCase();
if(login=="" || pswrd=="" || pswrd2=="" || email==""){
errors.push("Одно или несколько полей не заполнено.");
}
Проверяем тип вводимых данных.
if(typeof login != "string" || typeof pswrd != "string" || typeof pswrd2 != "string" || typeof email != "string"){
errors.push("Неправильный формат данных.");
}
Проверяем на запретные символы и длину строк. Проверяем совпадает ли пароль и повтор пароля.
if(/[^a-zA-Z0-9]/.test(login)){
errors.push("Неправильный формат логина.");
}
if(/[^a-zA-Z0-9@.]/.test(email) ||
!email.includes("@") ||
!email.includes(".") ||
email.includes("@.") ||
email.includes(".@")
){
errors.push("Неправильный формат email.");
}
if(login.length < 4 || login.length > 25){
errors.push("Длина логина от 4 до 25 символов.");
}
if(pswrd != pswrd2){
errors.push("Пароли не совпадают.");
}
if(email.length > 50){
errors.push("Длина email до 50 символов.");
}
Теперь проходимся по всему списку пользователей. Проверяем есть ли уже введённые логин и email в списке.
for(let i=0; i < Users.length; i++){
if(Users[i].login == login){
errors.push("Логин уже используется.");
}
if(Users[i].email == email){
errors.push("Email уже используется.");
}
}
Если ошибки есть, отправляем клиенту инструкцию с помощью socket.emit("errors", errors);
if(errors.length != 0){
socket.emit("errors", errors);
}
Если ошибок нет, создаем хэш и хэшируем логин и пароль. Хэш логина можно будет вписать в куки и идентифицировать пользователя по нему.
else{
const keyWord = "my_word123";
hLogin = sha256(keyWord + login);
hPassword = sha256(keyWord + pswrd);
Создаём новую запись и добавляем в список Users.
const userNew = {
login: `${login}`,
hPassword: `${hPassword}`,
email: `${email}`,
hLogin: `${hLogin}`,
activated: false
};
Users.push(userNew);
Осталось записать данные в файл и отправить клиенту уведомление об успешной регистрации.
jsonString = JSON.stringify(Users, null, 2);
fs.writeFileSync("./users.json", jsonString);
socket.emit("success");
}
Чтобы проверить работу, сохраните все 3 файла: app.js, register.html и users.json
Зайдите через командную строку (в Windows cmd) в нужную папку. Введите
node app.js
и введите в адресной строке браузера:
http://localhost/register
На странице регистрации откройте консоль (F12) и проверяйте результат
Исходник сервера.
Исходник клиента.
За другими скриптами сюда.