ДОВІДНИК З NODE-RED українською мовою
Написати фрагмент програми на Node-RED, який буде записувати документ про користувача в базу даних MongoDB на основі отриманих даних у форматі:
{
firstname: "Myname", //Імя
lastname: "Mylastname", //Прізвище
midlename: "Mymidlename", //По батькові
roles:["admin","enduser"], //ролі які є у користувача
email:"login@mail.org", //поштова адреса
avatar: "c:/tmp/avatar.png", // розміщення файлу аватарки у локальному сховищі
password: "password" //пароль в незакодованому вигляді
}
Повинна бути реалізована наступна функціональність:
avatar
повинно бути замінено на дані з файлу зображення, яке зчитується за адресою розміщенняpassword
повинен бути замінений зашифрованою версією, щоб убезпечити витік паролів при компроментації серверуУ даному рішенні використовуються:
read file
для читання файлівbcrypt
(опис) для хешування паролівnode-red-node-mongodb
node-red-contrib-bcrypt
Застосунок реалізований у вигляді одного потоку, що включає три логічні частини:
Inject
виконує роль тестового вузлу, що реалізовувати перевірку різних сценаріїв. Він задає значення userdata
у форматі JSON, як це описано в завданні.
Як приклад, його зміст може бути таким:
{
"firstname": "Myname",
"lastname": "Mylastname",
"midlename": "Mymidlename",
"roles": [
"admin",
"enduser"
],
"email": "login@mail3.org",
"avatar": "C:/tmp/imgs/1683744936871horse01-0.png",
"password": "password"
}
Далі у вузлі readavatar
зчитується файл з аватаркою, який заданий у властивості userdata.avatar
.
Отримані прочитані дані зберігаємо у тій же властивості змінної потоку, звідки брали адресу файлу.
На цьому формування вхідних даних завершено і ініціюється процедура перевірки наявності користувача в базі даних по його email. Для цього у payload
треба задати оператор запиту пошуку Mongo, що у даному випадку вказує на поле документу email
та його значення, що міститься у userdata.email
.
Даний фільтр використовується вузлом getfromdb
для пошуку усіх документів, що відповідають даній умові у колекції users
бази даних myatlas
(налаштування конфігураційного вузла такі самі як у попередньому прикладі).
Якщо хоч один документ що задовольняє даному прикладу знайдений, вузол поверне масив документів, що свідчить про наявність користувача в базі (по факту не має бути більше ніж одного). Якщо документ не знайдено, то вузол switch
перенаправить потік по першому шляху, якщо знайдено - по другому, де він закінчується вузлом з повідомленням.
Якщо документів немає починається частина шифрування та запису. Для початку дані користувача копіюються в msg.payload
:
Пароль користувача не варто зберігати у відкритому вигляді з міркувань безпеки. Тому його варто зашифрувати, щоб навіть при компрометації бази даних, не можна було б дізнатися паролі користувачів а тільки їх зашифровані версії, за якими практично неможливо відновити оригінальний пароль. Для шифрування використаємо вузол bcrypt
з наступними налаштуваннями:
Далі потік направляється на вузол tomongo
, де корисне навантаження зберігається як окремий документ в колекції users
. Зверніть увагу, що виставлена опція зберігання msg.payload
. Також, враховуючи що властивість _id
не задана, вона буде формуватися автоматично.
Експорт потоку доступний за посиланням