Оффтоп Alexander Gornyi
2 754

Стартап дня: платформа для авторизации пользователей на сайтах Auth0

Сервис предоставляет инструменты авторизации по подписке.

В закладки

Директор по стратегии и анализу Mail.Ru Group Александр Горный каждый день рассказывает о примечательных проектах.

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

Появились социальные сети и вход на сайт с их помощью. Появилась Active Directory. Появилась двухфакторная аутентификация. Появились новые требования по безопасности и устойчивости к перебору. Появилась сертификация HIPAA. И всё это не только много кода, это всё много разного кода: разные библиотеки, разные SDK, разные API. Фронтенд теперь пишется для трёх платформ, а не для одной.

Американский стартап Auth0 написал современную авторизацию, оформил её в аккуратный SDK и продаёт по подписке. Рекламный слоган: «Начните программировать бизнес-идеи в первый день разработки, а не на четвертый месяц». Минимальный пакет бесплатен, максимальный публичный тариф — $1400 в месяц за 10 тысяч активных пользователей. При больших объёмах нужно индивидуально договариваться.

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

Те, для кого несколько центов на пользователя непринципиальны, остаются с сервисом навсегда, таких тоже много. Auth0 потратил $54 млн инвестиций, сейчас у него 3500 платящих клиентов и, судя по их пиару, это близко к пределу американского рынка. В последнем раунде компания привлекла $55 млн для международного развития.

#стартапдня

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Alexander Gornyi", "author_type": "self", "tags": ["\u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0434\u043d\u044f"], "comments": 12, "likes": 11, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 42537, "is_wide": false }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15388' + '59599') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 42537, "author_id": 121721, "diff_limit": 1000, "urls": {"diff":"\/comments\/42537\/get","add":"\/comments\/42537\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/42537"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

12 комментариев 12 комм.

Популярные

По порядку

Написать комментарий...
4

Последние три месяца пользуемся Auth0 при ~2500 пользователях, нужна единая авторизация на нескольких продуктах. Наш продукт нишевый.
 
Из плюсов:
— не надо поддерживать собственный oauth сервер, который отключили и перевели пользователей в auth0;
— auth0 несет ответственность за данные пользователей, апдейты, защиту;
— у них быстрые серваки, и все работает из коробки;
— В мобильные приложения легко встроить, да и в веб несложно. Хотя занимает время. Это не 5 минут, это пара дней работы, учитывая всякие кейсы, рефреш токена, подтверждение имейла и так далее;
—Логи и по ним даже можно что-то понять;

Из минусов:
— Теперь на нашем сайте вместо модального окошка логина идет переход на сайт на auth0. Это раздражает + уход с нашего сайта;
— Можно сделать форму на сайте, но тогда невозможен рефреш токена. Т. е. рефреш только при условии логина через сайт auth0;
— Отсутствует локализация статусов сброса пароля и подтверждения регистрации, только на английском. Хотя локализовывается сам виджет. Ну как локализовывается — вручную переписывается текст, благо его можно менять :-) 
— Стиль виджета тоже меняется, но не сильно.
— Невозможно поменять пароль через апи с токеном юзера. Можно только сбросить с последующей отправкой письма и переходом на auth0 — усложнение жизни пользователю;
— Невозможно через апи запросить заново отправить письмо подтверждения имейла;
— Невозможно покрыть тестами "кастомные" правила/хуки (на js, кстати). Доки к ним не всегда правильные, кое-где устаревшие. И что глупое — невозможно тестировать вручную правило не сохраняя. Сохраненное автоматом попадает в продакшен и включается. Ну тут мы все знаем к чему приводит ручная проверка кода на продакшене :-) 
— Если что-то сломалось — удачи в поиске ошибки, ведь auth0 отдает довольно общую ошибку, а отдебажить их код невозможно. Если кто-то что-то не то прописал в конфигах — посмотреть историю изменений и откатить невозможно, не гит же.
— Ну и самое бесячее — сложно тестировать. Это касается как ручного тестирования, так и автоматических тестов. Особенно такие кейсы как рефреш токена или некие ошибки. Поэтому интеграция не настолько быстрая и приятная как кажется.

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

Ответить
0

Если не секрет, что за сервис? Почему решили отказаться от своей авторизации?

Вроде ж авторизация — проблема решённая давно (если не нужна куча примочек). Если у вас популярный ЯП и фреймворк, как правило есть настраиваемые библиотеки, которые можно подключить за три пинка.

Я не теоретик, если что, связка python+Django+django-allauth+django-rest-auth даёт регистрацию, авторизацию, серверные шаблоны, REST-API и поддержку 25+ соц.сетей. OAuth не настраивал, но и там пакетов куча.

Ответить
1

Если не секрет, что за сервис?

https://goabout.com/ — мы делаем "транспортные" решения для муниципалитетов в Нидерландах, это апи планировщиков маршрутов (aka местные google maps), тачскрины с картами на крупных станциях, вело- и каршеринг, продажа билетов на транспорт и специфичные для отдельных провинций штуки.

Ко всему этому прилагается набор как апи/админок, так и сайтов для пользователей. Продукты разные, и админки к ним тоже. Для простоты разработки, поддержки и использования.

Поэтому нужна единая система авторизации, независимая от продукта. И тут вступает в дело oauth2.

Почему решили отказаться от своей авторизации?

Потому что у нас очень маленькая команда, пять человек. Из-за работы с муниципалитетами, мы должны следовать всем стандартам: от банальных своевременных патчей и до GDPR ("General Data Protection Regulation", который как раз в мае вступил в силу).

Именно зарегистрированных пользователей у нас не так много, держать свой сервак авторизации и постоянно за ним следить/обновлять — дорого. Auth0 уже сертифицирована и берет на себя ответственность — и все это за €30 в месяц при нашей нагрузке.

Ответить
0

Да, в вашем случае правильное решение. В общем и целом довольны? Количественно минусов больше, чем плюсов, но качественно плюсы сильно перевешивают, конечно, особенно по части эффективности.

Ответить
0

— Невозможно через апи запросить заново отправить письмо подтверждения имейла;
Можно. Если нужно будет могу показать как.

Ответить
0

Давай. Но чтобы с запрашивать напрямую с фронта, а не через бек и management API.

Ответить
0

А вот это у тебя в первом пункте не было написано :) Для себя проблем с инициированием этого через бэк и managment API не увидели.

Ответить
0

Потому что это костыль для очень очевидной задачи. Юзер должен иметь возможность отправить себе новое письмо (с лимитами, конечно) ;)

Ответить
1

Знаю многих людей, которые по началу очень скептически относились к Auth0. Что-то вроде: зачем тут нужен third-party service, лучше сами напишем. Но если внимательно присмотреться, то Auth0 это - монстр. В нем столько уже всего понапихано и столько разных кейсов предусмотрено. Понятно, что в большинстве проектов Auth0 используется скорей всего на процентов 20% максимум. Тут вам из коробки
- защита против брутфорса
- авторизация через разные приложения
- рефреш токена, админка, логи(в том числе гео)
- мощное api
- возможность написания кастомных middleware на node, которые будут исполняться прямо на auth0
- встроенные email оповещения
- мультифакторная аутентификация, paswordless аутентификация
И это еще лишь самое основное. Делать с помощью Auth0 можно очень много вещей, но без нескольких дней чтения документации не обойтись, если конечно задача не просто сделать базовую аутентифицаию пользователя.

Ответить
0

Артём а у них же там есть бесплатный пакет до 10к юзеров. Зачем платить?

Ответить
0

У бесплатных аккаунтов нет custom domains, нельзя менять дизайн имейла и еще каких-то фишек нет.

Ответить
0

Пользуюсь IdentityServer4, бесплатное, на net core, open source.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Команда калифорнийского проекта
оказалась нейронной сетью
Подписаться на push-уведомления