В течение этой недели Дивали я начинаю новый проект, и я намерен проводить около 8 часов в день, надеясь закончить этот проект в течение недели.
Это отчасти для того, чтобы отпраздновать радость Дивали. Но также посмотреть, можно ли завершить полноценный проект за неделю, как и ожидалось от меня, на работе по разработке программного обеспечения. Пожелай мне удачи!
Объем проекта
- Аналог https://tinyurl.com/app
- Предоставьте пользователям возможность зарегистрироваться (подтвердите регистрацию с помощью recaptcha)
- Только авторизованные пользователи могут создавать короткие ссылки
- Пользователи могут иметь две роли
- Пользователи с правами администратора должны иметь возможность видеть 50 наиболее часто используемых коротких ссылок.
- Пользователи без прав администратора должны иметь возможность видеть свои 50 наиболее часто используемых коротких ссылок.
- Пользователи без прав администратора также должны иметь возможность отключать некоторые ссылки.
Ежедневные журналы
1 ноября 2021 г.:
- Настройка структуры проекта.
- Установка базовых зависимостей, таких как Express, Jest, Nodemon, Node-Fetch и т. д.
- Понимание HTML-форм
- Понимание того, как файлы cookie могут использоваться для создания пользовательских сеансов
- Как разбирать и писать заголовки cookie в Express
- Базовый процесс входа и регистрации пользователя без какой-либо базы данных.
- Коды состояния HTTP, перенаправление.
- Шаблонирование HTML с помощью усов
- Тестирование полной интеграции всех маршрутов, перенаправлений, управления сессиями путем выполнения HTTP-запросов с использованием node-fetch.
- Тестирование функциональности регистрации, вход в систему
- Добавление рабочего процесса GitHub для запуска интеграционных тестов на GitHub
2 ноября 2021 г.:
- Модулируйте кодовую базу, разделив контроллеры, модели и маршрутизаторы на отдельные каталоги.
- Использование экспресс-маршрутизатора для отделения исходящей маршрутизации от запуска сервера
- Понимание того, как лучше всего сопоставлять входящие маршруты с помощью пакета path-to-regexp
- Добавление промежуточного программного обеспечения аутентификации, которое выполняет все перенаправления для маршрутов, которые ожидают существования сеанса, поэтому маршрутам не нужно вручную проверять наличие сеанса.
- Использование подписанных файлов cookie для обеспечения того, чтобы полезная нагрузка файлов cookie не была подделана (понимание цифровых подписей и то, как подписанные файлы cookie в Express)
- Использование шифрования файлов cookie для запутывания содержимого файлов cookie, чтобы файл cookie не мог быть прочитан какой-либо системой, кроме сервера (понимание того, как добавить шифрование в полезные данные файла cookie в Express).
- Настройка Postgres с помощью Docker
- Создание схемы базы данных для пользователей и ролей
- Изменение процесса регистрации/входа для использования базы данных в качестве постоянного хранилища (в отличие от использования эфемерного объекта JS в памяти для хранения пользователей в системе)
- Добавьте установку Postgres как службы в рабочий процесс GitHub, чтобы интеграционные тесты могли продолжать выполняться на GitHub.
3 ноября 2021 г.:
- Поймите, как хранить пароли в базе данных: простое хеширование, криптографическое хеширование, криптографическое хеширование с солью, добавление перца, независимая от времени проверка на равенство, многократные итерации генерации хэша.
- Использование pbkdf2 из модуля NodeJs’ Crypto для генерации соленого хеш-значения перед сохранением и для сопоставления паролей.
- Поймите разницу между шифрованием (AES), хешированием (SHA-256) и кодированием (base64).
- Поймите разницу между хеш-функциями и криптографическими хэш-функциями и почему коллизии в криптографических хэш-функциях вредны. Например, коллизия SHA-1 обнаружена в 2017 году делает его плохим кандидатом для хеширования паролей.
- Добавить модульный тест для сопоставления паролей (извлечение соли, создание хэша, сравнение хэша)
- Обновите промежуточное программное обеспечение аутентификации, чтобы передать полный пользовательский объект для аутентифицированных маршрутов, чтобы контроллеры маршрутов могли получать доступ к информации о пользователе без необходимости постоянно запрашивать базу данных.
- Поймите последствия SQL-инъекций и почему нам нужно использовать
$1
и$2
в параметрах SQL-запроса. - Добавлено исправление ошибки при создании файла cookie в процессе регистрации, где вместо сохранения user_id сохранялось имя пользователя.
- Создайте схему базы данных для хранения сопоставления коротких и длинных ссылок и подсчета использования.
- Убедитесь, что алгоритм сокращения не имеет коллизий, используя счетчик увеличения в Postgres.
- Используйте функцию NodeJs Crypto createHash для создания дайджеста base64 + уникальный счетчик для получения уникальной короткой ссылки
- Добавьте контроллер ссылок, чтобы обеспечить возможность преобразования между короткими и длинными ссылками для каждого пользователя (короткие ссылки поддерживаются для каждого пользователя вместе с аналитикой использования).
- Интеграционные тесты для многопользовательского многозвенного сокращения и реверсирования ссылок, плюс аналитика использования.
4 ноября 2021 г.:
- Исправление ошибки: Разрешить развертывание коротких ссылок любым пользователем, независимо от того, какой пользователь их создал.
- Добавьте тест, чтобы гарантировать, что развертывание коротких ссылок может быть выполнено любым пользователем.
- Используйте функцию
randomBytes
из криптобиблиотеки NodeJs для генерации псевдослучайной строки для создания укороченной ссылки (вместо более раннего подхода с использованием md5 для этого) - Рефакторинг тестов для ссылок
- Добавить новый маршрут для приема запросов на создание короткой ссылки
- Узнайте, как можно использовать события в HTML-формах для вызова функций JavaScript вместо перезагрузки всей страницы при каждой отправке формы. Такие приложения называются «одностраничными приложениями», где страница загружается только один раз, а все остальное выполняется с помощью JavaScript, поэтому мы загружаем только те части, которые необходимы для каждого действия, а не всю страницу, что делает страницу более отзывчивой и быстрый.
- Добавьте клиентскую форму и JavaScript для вызова соответствующего маршрута и отображения пользователю укороченной ссылки.
- Узнайте, почему доменное имя недоступно для HTTP-сервера, работающего на порту. После разрешения DNS HTTP-запросы доставляются на IP-адрес сервера; сервер не может сделать вывод, какое доменное имя фактически использовалось для выполнения запроса. На самом деле может быть несколько доменных имен, сопоставленных с одним и тем же IP-адресом.
- Используйте объект
window.location
на клиентском JavaScript, чтобы создать окончательный короткий URL-адрес, добавив хост текущего окна. В качестве альтернативы сервер мог бы использовать заголовок хоста запроса для создания короткой ссылки. Но это не будет работать для всех пользовательских агентов (например,curl
в CLI) - Добавьте тесты, чтобы убедиться, что сокращение ссылок доступно только для аутентифицированных сеансов с использованием уже существующего промежуточного программного обеспечения аутентификации.
- Добавить функциональность для перенаправления сокращенных ссылок на исходную ссылку
- Обновите промежуточное ПО аутентификации для поддержки неаутентифицированного маршрута, совпадающего как с путем маршрута, так и с методом маршрута (т. е. аутентификация будет пропущена, если и маршрут, и метод соответствуют правилу исключения). Все остальные случаи рассматриваются как аутентифицированные маршруты.
- Добавить исключение для маршрута короткой ссылки
GET
в промежуточном программном обеспечении аутентификации, которое будет перенаправлять на исходную (длинную) ссылку, не требуя аутентификации. - Подготовьте аналитический SQL-запрос для поиска самой часто используемой короткой ссылки для данного пользователя.
- Понимать, как создаются HTML-таблицы.
- Отображение основных ссылок текущего пользователя в таблице HTML, которая автоматически обновляется каждые 5 секунд с использованием клиентского JavaScript и
setInterval
.
5 ноября 2021 г.:
- Добавьте тесты для данных аналитики
- Протестируйте контроллер аналитики, передав фиктивное промежуточное ПО, которое действует как сообщения ответа на запрос Express, не требуя перезапуска сервера («утиный ввод»)
- Протестируйте, чтобы убедиться, что сортировка ссылок в таблице аналитики соответствует заранее определенному порядку: используйте
setTimeout
, чтобы убедиться, что сокращение определенных ссылок происходит в более поздний момент времени, и тесты проверяют, что ссылки, которые сокращаются позже, упорядочены в порядке убывания создание. - Подробно изучите, как промисы реализуются в JavaScript, и реализуйте игрушечную версию промиса, которая делает то же самое.
- Добавить маршруты для включения и отключения ссылок
- Добавьте интерфейсный JavaScript для вызова серверных функций для включения и отключения ссылок из таблицы аналитики.
- Измените пользовательский интерфейс с помощью Bootstrap для регистрации, входа и домашней страницы.
- Развертывание в Heroku: создайте новое приложение для NodeJs, установите Postgres, добавьте git remote для Heroku, обновите порт (чтобы он учитывал переменную среды Heroku
PORT
, на которую направляется трафик Heroku) - Система РАБОТАЕТ по адресу https://oteetwirl.herokuapp.com/home
7 ноября 2021 г.:
- После развертывания 5-го числа от пользователей были получены некоторые отзывы. На основании этого внесены следующие изменения.
- Разрешить сокращать ссылки, даже если они не имеют префикса
http
илиhttps
. - Измените метод HTTP для отключения и включения ссылок с
GET
наPOST
. Это связано с тем, что включение/отключение изменяет атрибуты, связанные со ссылками, и, следовательно, это не должен быть запросGET
, посколькуGET
обычно используется только для получения ресурсов. - Обновите интерфейсный JavaScript, чтобы уменьшить интервал между вызовами маршрута
/analytics
с 1 секунды до 30 секунд. - Явно обновлять данные аналитики на главной странице, когда создается новая ссылка или включается/отключается существующая ссылка. Это сделано для уменьшения количества обращений из браузера к серверной части.
- Установите требования к минимальной длине паролей при регистрации.
- Добавьте Google reCAPTCHA v2 для регистрации, чтобы боты не создавали фиктивные учетные записи в базе данных.
- Добавьте секреты в серверную часть, чтобы обеспечить правильную проверку виджета reCAPTCHA из внешнего интерфейса и исключить проверку reCAPTCHA в тестах.
- Незначительные изменения в главной странице интерфейса.
- Разрешить пользователям с правами администратора видеть все ссылки на главной странице, включая ссылки, созданные другими пользователями.
- Убедитесь, что обновление статуса ссылки (включение/отключение) может выполнять только владелец ссылки, независимо от роли текущего пользователя.
- Поймите, как происходит терминация SSL на Heroku.
- Добавьте переменную среды, которая определяет, должно ли приложение использовать протокол HTTPS. Если это так, запросы, сделанные через HTTP, будут перенаправлены на аналог HTTPS, а файлы cookie будут созданы с безопасным атрибутом.
- На этом завершается разработка приложения! Это заняло семь дней. 🎉
Это просто ежедневный журнал, который я вел, приступая к этому проекту. Я опубликую подробный пост об этом проекте, включая README в моем репозитории GitHub, как только он будет завершен. Счастливого Дивали!
Первоначально опубликовано на otee.dev 3 ноября 2021 г.