Это была непростая задача, заставить это двигаться. У меня даже была серьезная проблема с отделением коммитов git друг от друга, так что в итоге я коммитил все вместе.

Введение

Как я упоминал ранее, я спорил с самим собой об использовании либо WebSockets, с которыми я знаком, либо FireBase, о котором я имел слабое представление, но это сократит время разработки и даст мне много преимуществ в производительности. Правильно. Это было бы.

Но, в конце концов, я решил использовать WebSockets — поверх Socket.IO. Решение было довольно простым, я использовал WS раньше, и, поскольку я довольно ограничен во времени, которое я могу потратить на этот проект — это было самое простое решение.

Сомнения…

Я боролся с идеей пойти по самому простому пути — не добавлять сюда никакой аутентификации, кроме агентов, так как этот чат-модуль будет использоваться посетителями. Но правда в том, что это была бы не очень хорошая идея, поскольку буквально любой имел бы доступ к каждому чату. Это может привести к злоупотреблениям.

Конечно, агенты должны пройти аутентификацию, так как они играют ключевую роль на платформе. Я не создаю простой чат, я создаю систему службы поддержки. Поскольку агенты уже аутентифицируются с помощью токенов, не было никаких сомнений, что мне придется использовать их и для этой цели. А так как мне придется использовать их для аутентификации агента — понятно, что они должны будут использоваться и для гостей.

Решение

Поэтому я придумал использовать токены для всех пользователей. Но гость должен каким-то образом получить токен, и, поскольку он не аутентифицирован с помощью формы входа, я решил генерировать гостевой токен при каждой инициации чата.

Возвращенный токен впоследствии передается в строке запроса. Прелесть JWT дает мне возможность хранить данные внутри него — поэтому я воспользовался этим и передал результат Chat вместе с ним. Это помогает мне сэкономить время, а также производительность базы данных.

Вы также можете заметить, что ключ/значение type передается в токене. Это помогает мне проверить, является ли пользователь агентом или гостем, поэтому я могу разделить процесс auh. Опять же — это безопасная практика, поскольку токен подписан, поэтому никто не сможет успешно подделать токен, не имея доступа к моему секрету.