На днях под видосом про библиотеку Grammy js получил вот такой вопрос. Он подкинул мне идею написать развернутый ответ и напомнить вам, в чем разница между
авторизацией и
аутентификацией.
Во-первых, давайте разберемся с терминами:
Аутентификация – это подтверждение личности пользователя, отвечаем на вопрос «кто ты?»
Авторизация – это проверка прав доступа пользователя к определенным ресурсам или функциям, «что тебе разрешено делать?»
Во-вторых, респект комментатору – в вопросе термин использован абсолютно верно: никакой аутентификации нам делать не надо, её за нас делает телеграм (человек вводит свой номер телефона, код из смс, и телеграм понимает, кто он). На сайтах это реализуется с помощью логина/пароля и дополнительных барьеров типа двухфакторной аутентификации (код в смс, на почту, Google Authenticator).
В результате аутентификации тг знает, кто использует приложение. Благодаря этому, наш бот вместе с сообщением от пользователя получает объект с информацией о юзере – его телеграм id, ник, имя.
Авторизация же в боте, действительно, лежит на нашей стороне. Она всегда происходит после аутентификации, так как чтобы выдать права доступа, нам нужно знать, кто перед нами. Обычно данные о пользователе мы храним в базе данных в виде объекта, и если у нас несколько уровней доступа, то мы добавляем в объект поле
role
и присваиваем ему значение в зависимости от условий. Если роли всего две (админ / юзер), то можно обойтись флагом
isAdmin
с булевым значением.
Например, мы делаем бота для оплаты подписки и отправки контента (аналог бусти). По команде
/start
сохраняем нового пользователя в БД, создавая ему поле
subscriptionLevel: free
. Как только он производит оплату и мы получаем по API ответ об успешной оплате, меняем free на paid, а если оплачена супер-подписка – на pro. Ну а когда пользователь отправляет команду
/content
, мы идем в БД, проверяем его уровень доступа и исходя из него отправляем контент.
Краткий итог: для авторизации в тг-боте нам надо где-то хранить информацию об уровнях доступа пользователей, а также предусмотреть условия изменения этих уровней.
Если задача у вас простая на уровне «дать себе доступ админа, а остальным базовый», то можно вообще обойтись без всяких БД: узнаёте свой тг id и в коде проверяете
if (userId === мой_тг_айди) {….}
else { sendResponse("У Вас нет доступа к этим функциям") }
А ответ конкретно на вопрос такой: если мы заранее знаем круг пользователей и никаких критичных данных не отдаем (не паримся за безопасность, в общем), то можно на серваке в папке с ботом создать файлик с константой-массивом с айди всех пользователей, и в коде проверять, включен ли айди юзера в этот список. Если да – даём доступ. Если хочется более безопасно, или юзеров много, или логика получения/удаления прав доступа нужна, то см ответ выше
👆🏻❗️ВАЖНО:Оба процесса всегда происходят на бэкенде, это важно, так как происходит получение доступа к чувствительной информации (логин/пароль пользователя, его уровень доступа)
А вы когда-нибудь писали сами логику аутентификации или авторизации?