В течение этой недели Дивали я начинаю новый проект, и я намерен проводить около 8 часов в день, надеясь закончить этот проект в течение недели.

Это отчасти для того, чтобы отпраздновать радость Дивали. Но также посмотреть, можно ли завершить полноценный проект за неделю, как и ожидалось от меня, на работе по разработке программного обеспечения. Пожелай мне удачи!

Объем проекта

  1. Аналог https://tinyurl.com/app
  2. Предоставьте пользователям возможность зарегистрироваться (подтвердите регистрацию с помощью recaptcha)
  3. Только авторизованные пользователи могут создавать короткие ссылки
  4. Пользователи могут иметь две роли
  5. Пользователи с правами администратора должны иметь возможность видеть 50 наиболее часто используемых коротких ссылок.
  6. Пользователи без прав администратора должны иметь возможность видеть свои 50 наиболее часто используемых коротких ссылок.
  7. Пользователи без прав администратора также должны иметь возможность отключать некоторые ссылки.

Ежедневные журналы

1 ноября 2021 г.:

  1. Настройка структуры проекта.
  2. Установка базовых зависимостей, таких как Express, Jest, Nodemon, Node-Fetch и т. д.
  3. Понимание HTML-форм
  4. Понимание того, как файлы cookie могут использоваться для создания пользовательских сеансов
  5. Как разбирать и писать заголовки cookie в Express
  6. Базовый процесс входа и регистрации пользователя без какой-либо базы данных.
  7. Коды состояния HTTP, перенаправление.
  8. Шаблонирование HTML с помощью усов
  9. Тестирование полной интеграции всех маршрутов, перенаправлений, управления сессиями путем выполнения HTTP-запросов с использованием node-fetch.
  10. Тестирование функциональности регистрации, вход в систему
  11. Добавление рабочего процесса GitHub для запуска интеграционных тестов на GitHub

2 ноября 2021 г.:

  1. Модулируйте кодовую базу, разделив контроллеры, модели и маршрутизаторы на отдельные каталоги.
  2. Использование экспресс-маршрутизатора для отделения исходящей маршрутизации от запуска сервера
  3. Понимание того, как лучше всего сопоставлять входящие маршруты с помощью пакета path-to-regexp
  4. Добавление промежуточного программного обеспечения аутентификации, которое выполняет все перенаправления для маршрутов, которые ожидают существования сеанса, поэтому маршрутам не нужно вручную проверять наличие сеанса.
  5. Использование подписанных файлов cookie для обеспечения того, чтобы полезная нагрузка файлов cookie не была подделана (понимание цифровых подписей и то, как подписанные файлы cookie в Express)
  6. Использование шифрования файлов cookie для запутывания содержимого файлов cookie, чтобы файл cookie не мог быть прочитан какой-либо системой, кроме сервера (понимание того, как добавить шифрование в полезные данные файла cookie в Express).
  7. Настройка Postgres с помощью Docker
  8. Создание схемы базы данных для пользователей и ролей
  9. Изменение процесса регистрации/входа для использования базы данных в качестве постоянного хранилища (в отличие от использования эфемерного объекта JS в памяти для хранения пользователей в системе)
  10. Добавьте установку Postgres как службы в рабочий процесс GitHub, чтобы интеграционные тесты могли продолжать выполняться на GitHub.

3 ноября 2021 г.:

  1. Поймите, как хранить пароли в базе данных: простое хеширование, криптографическое хеширование, криптографическое хеширование с солью, добавление перца, независимая от времени проверка на равенство, многократные итерации генерации хэша.
  2. Использование pbkdf2 из модуля NodeJs’ Crypto для генерации соленого хеш-значения перед сохранением и для сопоставления паролей.
  3. Поймите разницу между шифрованием (AES), хешированием (SHA-256) и кодированием (base64).
  4. Поймите разницу между хеш-функциями и криптографическими хэш-функциями и почему коллизии в криптографических хэш-функциях вредны. Например, коллизия SHA-1 обнаружена в 2017 году делает его плохим кандидатом для хеширования паролей.
  5. Добавить модульный тест для сопоставления паролей (извлечение соли, создание хэша, сравнение хэша)
  6. Обновите промежуточное программное обеспечение аутентификации, чтобы передать полный пользовательский объект для аутентифицированных маршрутов, чтобы контроллеры маршрутов могли получать доступ к информации о пользователе без необходимости постоянно запрашивать базу данных.
  7. Поймите последствия SQL-инъекций и почему нам нужно использовать $1 и $2 в параметрах SQL-запроса.
  8. Добавлено исправление ошибки при создании файла cookie в процессе регистрации, где вместо сохранения user_id сохранялось имя пользователя.
  9. Создайте схему базы данных для хранения сопоставления коротких и длинных ссылок и подсчета использования.
  10. Убедитесь, что алгоритм сокращения не имеет коллизий, используя счетчик увеличения в Postgres.
  11. Используйте функцию NodeJs Crypto createHash для создания дайджеста base64 + уникальный счетчик для получения уникальной короткой ссылки
  12. Добавьте контроллер ссылок, чтобы обеспечить возможность преобразования между короткими и длинными ссылками для каждого пользователя (короткие ссылки поддерживаются для каждого пользователя вместе с аналитикой использования).
  13. Интеграционные тесты для многопользовательского многозвенного сокращения и реверсирования ссылок, плюс аналитика использования.

4 ноября 2021 г.:

  1. Исправление ошибки: Разрешить развертывание коротких ссылок любым пользователем, независимо от того, какой пользователь их создал.
  2. Добавьте тест, чтобы гарантировать, что развертывание коротких ссылок может быть выполнено любым пользователем.
  3. Используйте функцию randomBytes из криптобиблиотеки NodeJs для генерации псевдослучайной строки для создания укороченной ссылки (вместо более раннего подхода с использованием md5 для этого)
  4. Рефакторинг тестов для ссылок
  5. Добавить новый маршрут для приема запросов на создание короткой ссылки
  6. Узнайте, как можно использовать события в HTML-формах для вызова функций JavaScript вместо перезагрузки всей страницы при каждой отправке формы. Такие приложения называются «одностраничными приложениями», где страница загружается только один раз, а все остальное выполняется с помощью JavaScript, поэтому мы загружаем только те части, которые необходимы для каждого действия, а не всю страницу, что делает страницу более отзывчивой и быстрый.
  7. Добавьте клиентскую форму и JavaScript для вызова соответствующего маршрута и отображения пользователю укороченной ссылки.
  8. Узнайте, почему доменное имя недоступно для HTTP-сервера, работающего на порту. После разрешения DNS HTTP-запросы доставляются на IP-адрес сервера; сервер не может сделать вывод, какое доменное имя фактически использовалось для выполнения запроса. На самом деле может быть несколько доменных имен, сопоставленных с одним и тем же IP-адресом.
  9. Используйте объект window.location на клиентском JavaScript, чтобы создать окончательный короткий URL-адрес, добавив хост текущего окна. В качестве альтернативы сервер мог бы использовать заголовок хоста запроса для создания короткой ссылки. Но это не будет работать для всех пользовательских агентов (например, curl в CLI)
  10. Добавьте тесты, чтобы убедиться, что сокращение ссылок доступно только для аутентифицированных сеансов с использованием уже существующего промежуточного программного обеспечения аутентификации.
  11. Добавить функциональность для перенаправления сокращенных ссылок на исходную ссылку
  12. Обновите промежуточное ПО аутентификации для поддержки неаутентифицированного маршрута, совпадающего как с путем маршрута, так и с методом маршрута (т. е. аутентификация будет пропущена, если и маршрут, и метод соответствуют правилу исключения). Все остальные случаи рассматриваются как аутентифицированные маршруты.
  13. Добавить исключение для маршрута короткой ссылки GET в промежуточном программном обеспечении аутентификации, которое будет перенаправлять на исходную (длинную) ссылку, не требуя аутентификации.
  14. Подготовьте аналитический SQL-запрос для поиска самой часто используемой короткой ссылки для данного пользователя.
  15. Понимать, как создаются HTML-таблицы.
  16. Отображение основных ссылок текущего пользователя в таблице HTML, которая автоматически обновляется каждые 5 секунд с использованием клиентского JavaScript и setInterval.

5 ноября 2021 г.:

  1. Добавьте тесты для данных аналитики
  2. Протестируйте контроллер аналитики, передав фиктивное промежуточное ПО, которое действует как сообщения ответа на запрос Express, не требуя перезапуска сервера («утиный ввод»)
  3. Протестируйте, чтобы убедиться, что сортировка ссылок в таблице аналитики соответствует заранее определенному порядку: используйте setTimeout, чтобы убедиться, что сокращение определенных ссылок происходит в более поздний момент времени, и тесты проверяют, что ссылки, которые сокращаются позже, упорядочены в порядке убывания создание.
  4. Подробно изучите, как промисы реализуются в JavaScript, и реализуйте игрушечную версию промиса, которая делает то же самое.
  5. Добавить маршруты для включения и отключения ссылок
  6. Добавьте интерфейсный JavaScript для вызова серверных функций для включения и отключения ссылок из таблицы аналитики.
  7. Измените пользовательский интерфейс с помощью Bootstrap для регистрации, входа и домашней страницы.
  8. Развертывание в Heroku: создайте новое приложение для NodeJs, установите Postgres, добавьте git remote для Heroku, обновите порт (чтобы он учитывал переменную среды Heroku PORT, на которую направляется трафик Heroku)
  9. Система РАБОТАЕТ по адресу https://oteetwirl.herokuapp.com/home

7 ноября 2021 г.:

  1. После развертывания 5-го числа от пользователей были получены некоторые отзывы. На основании этого внесены следующие изменения.
  2. Разрешить сокращать ссылки, даже если они не имеют префикса http или https.
  3. Измените метод HTTP для отключения и включения ссылок с GET на POST. Это связано с тем, что включение/отключение изменяет атрибуты, связанные со ссылками, и, следовательно, это не должен быть запрос GET, поскольку GET обычно используется только для получения ресурсов.
  4. Обновите интерфейсный JavaScript, чтобы уменьшить интервал между вызовами маршрута /analytics с 1 секунды до 30 секунд.
  5. Явно обновлять данные аналитики на главной странице, когда создается новая ссылка или включается/отключается существующая ссылка. Это сделано для уменьшения количества обращений из браузера к серверной части.
  6. Установите требования к минимальной длине паролей при регистрации.
  7. Добавьте Google reCAPTCHA v2 для регистрации, чтобы боты не создавали фиктивные учетные записи в базе данных.
  8. Добавьте секреты в серверную часть, чтобы обеспечить правильную проверку виджета reCAPTCHA из внешнего интерфейса и исключить проверку reCAPTCHA в тестах.
  9. Незначительные изменения в главной странице интерфейса.
  10. Разрешить пользователям с правами администратора видеть все ссылки на главной странице, включая ссылки, созданные другими пользователями.
  11. Убедитесь, что обновление статуса ссылки (включение/отключение) может выполнять только владелец ссылки, независимо от роли текущего пользователя.
  12. Поймите, как происходит терминация SSL на Heroku.
  13. Добавьте переменную среды, которая определяет, должно ли приложение использовать протокол HTTPS. Если это так, запросы, сделанные через HTTP, будут перенаправлены на аналог HTTPS, а файлы cookie будут созданы с безопасным атрибутом.
  14. На этом завершается разработка приложения! Это заняло семь дней. 🎉

Это просто ежедневный журнал, который я вел, приступая к этому проекту. Я опубликую подробный пост об этом проекте, включая README в моем репозитории GitHub, как только он будет завершен. Счастливого Дивали!

Первоначально опубликовано на otee.dev 3 ноября 2021 г.