Сделай OAuth2 - забудь о логинах и паролях

Упрощайте жизнь пользователей и вам воздастся

Автор: Ivan Osipov
Дата публикации: 2018-10-26
В категориях: Development, Security, Thinking
Тэги: oauth2, security, thinking, development

Шёл 2018 год, а люди продолжали вводить логины и пароли, снова логины и пароли, опять логины и пароли. Тебе не кажется это странным? Почему огромное количество сервисов всё еще просит своих пользователей залогиниться? Давай разберемся в этом вопросе.

Мы живем в век инноваций и автоматизируем каждый чих человеческой деятельности, но что касается интернета, то тут я теряюсь в догадках. Почему очередной интернет магазин книг просит у меня логин и пароль? Почему я должен “по умолчанию” пройти регистрацию? Почему мне не дают в качестве пути по умолчанию OAuth2 от, например, Google? Всё это сбивает с толку, кажется, что очередной сайт хочет сохранить мой пароль (а самые продвинутые хотят сохранить только хеш от него), чтобы при первой хакерской атаке всё утекло в интернеты.

Пароли это, пожалуй, одна из самых уязвимых частей секретной жизни человека в интернете. Как часто вы используете один и тот же пароль для разных ресурсов? Хотя бы раз вы повторялись? Как часто ваши пароли похожи на столько, что узнав один, путем недолгого перебора можно получить другой? Самые продвинутые из нас используют сервисы типа LastPass, которые хранят ваши рандомные пароли для разных ресурсов, но кажется, что таких людей не много, да и сам факт потребности в подобных сервисах заставляет задуматься.

Сколько сложностей связано с регистрацией? Обычно, нужно получить email, в котором надо нажать на ссылку. А если почта на смартфоне, то порой нужно начала нажать на кнопку в телефоне, затем логиниться с ноутбука, в общем всякие реализации бывают. Да и пять сотен раз я уже подтверждал всем вокруг, что это мой email.

А эти логины? Вы пробовали подобрать хороший логин для твиттера? Если только у вас редкая комбинация имени и фамилии или супер-уникальный никнейм, то всё пройдет без проблем, но это же исключения! Идея логина в том, чтобы составить пару паролю, дать дефолтное имя и позволить пользователю представить себя, но как мне представить себя, если я не помню свой логин, потому что мой стандартный был занят кем-то, а тот, что я придумал специально для этого сервиса, я уже забыл? Как мне понять при повторном логине, что именно на этом сервисе я задействовал все свои силы на подбор уникального логина?

Похоже, что почта в качестве идентификатора пользователя это хорошо, но как я озвучил выше, почту нужно подтверждать, а еще их можно зарегистрировать несколько и получить много разных аккаунтов, в результате по ошибке путаться, каким из них пользоваться. Или, что если вам нужно что-то большее, например, гарантия, что это не просто “уникальный интернет пользователь”, но и в реальном мире уникальный человек? Очевидно, сегодня технически этого трудно достигнуть, инструменты есть, но эти случаи особые и к ним этот текст не имеет отношения. Квазиуникальность через номер телефона должна быть достаточна в большинстве случаев. Представляете как усложнится жизнь пользователя, если вы его и номер телефона спросите?

В общем, вопросов много, давайте поищем ответ.

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

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

OAuth2 решает наши проблемы. Я не буду вдаваться здесь в детали, но высокоуровнево это выглядит так: пользователь хочет войти, затем его редиректит на identity provider (например, на гугл), где он скорее всего уже залогинен, но если нет, то вводит там свои логин и пароль и подтверждает, что этому приложению можно дать доступ к данным этого пользователя. После этого его редиректит назад с кодом, который отправляется клиентом на бекенд, а бекенд обменивает код на токен и с помощью токена запрашивает данные по пользователю. Алгоритм довольно простой в реализации, со своими нюансами, но о них в другой статье, и самое главное, что в 99% случаев аутентификация сводится к нажатию на одну-две кнопки. Более того, в зависимости от identity provider ты можешь получить много разных полезных данных для твоего конкретного случая и твоего конкретного приложения, например, Google в списке информации о пользователе при указании определенного scope ты можешь получить номер телефона пользователя и сформировать таким образом квазиуникальных пользователей, или же получить полный список email этого пользователя, чтобы он мог заходить под любым из них.

Identity provider хранит информацию защищёно и не даст пользователю просто так упустить свой аккаунт в чужие руки, часто поддерживается двух факторная аутентификация.

А что с корпоративными системами? В случае Google, если вы работаете с G Suite, то это совсем идеальное решение, если же вы не завязаны на какой облачный офис, то вы всегда можете поднять один корпоративный OAuth сервер и ходить на него из ваших приложений для аутентификации. В любом случае, это куда удобнее, чем вводить по миллиону раз учетные данные. Хорошо, что современные браузеры уже автоматизировали процесс хранения учетных данных и использования последних, когда вам это необходимо, потому что человечество по неведомой причине не спешит отказаться от логина и пароля.

Получается, если есть инструмент - OAuth2, который в пару кликов способен сделать счастливыми и пользователя, и бизнес, то почему бы им не заменить устаревший, неудобный, менее безопасный способ использования логинов и паролей?

comments powered by Disqus