Пошаговая инструкция по работе с Telegram Ad Platform

Что же это такое?

Процитируем Википедию:

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

идентифицирован

 (мы должны знать, кто он) и

аутентифицирован

 (подтверждена его идентичность).

Реализация авторизации при разработке корпоративной информационной системы или продукта, ориентированного на корпоративный сектор — очень сложная и ответственная задача, которой часто уделяется недостаточное внимание на этапе проектирования и первичном этапе разработки, что в будущем ведет к «костыльной» реализации.

Какой порог входа и почему

Начать рекламную кампанию в мессенджере можно только после пополнения счета на 2 млн евро. 1 млн можно потратить на рекламу, другой будет заморожен в качестве депозита. Если рекламодатель решит расторгнуть контракт с Telegram до того, как потратит на рекламу 10 млн евро в течение последних 12 месяцев, Telegram забирает депозит себе. Если успеет, то 1 млн евро вернется к рекламодателю.

Почему порог входа настолько высок? Наиболее полное объяснение дал Никита Лихачев, директор по стратегическим коммуникациям рекламных технологий VK.

По его мнению, в данный момент Telegram хочет привлечь крупные рекламные агентства, которые зарабатывают на том, что управляют рекламой своих клиентов и получают за это комиссию. И они уже появились. Одно из первых агентств, готовое работать с Telegram, – Magnetto.pro.

Представители компании сказали The Bell, что хотят протестировать платформу и использовать ее в дальнейшем. По их мнению, Telegram Ad Platform может стать хорошим инструментом рекламы, в том числе потому, что небольшие сообщения не подвержены баннерной слепоте.

Большие компании могут позволить пополнение баланса на крупную сумму. Они не перестанут пользоваться платформой, если кто-то из клиентов обанкротился, а найдут новых. По его мнению, задача Дурова – быстро привлечь в Telegram Ad Platform основные агентства, а затем их руками приводить новых клиентов с основными чеками.

Что ждет владельцев каналов

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

Shared library vs sidecar

Выбранный подход не избавил нас от такой проблемы: поначалу функционал авторизации распространялся в виде библиотеки. Любое добавление нового функционала или изменение существующего функционала ролевой модели (а в момент ее создания и начальных этапов развития это происходило довольно часто) означало обновление всех сервисов, которых это изменение касается.

Для решения этой проблемы мы решили применить архитектурный шаблон «Ambassador» — вынести функционал, который касается авторизации, в отдельный Sidecar и назвали его Security proxy.

Доменный сервис деплоится вместе с Security proxy в одном Pod-е в Kubernetes. Среда настраивается так, чтобы исключить возможность запросов к доменным сервисам не через Security proxy. Сам Security proxy ничего не знает о логике доменного сервиса, ему лишь известно API, выставленное доменным сервисом наружу, он выступает в роли амбассадора.

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

Авторизация

Чтобы начать пользоваться платформой, пройдите авторизацию. Для этого у вас должна быть учетная запись Telegram. Введите номер телефона на странице входа в систему:

Подтвердите вход в платформу:

Варианты решений

Разумеется, начали с классического, проверенного подхода — WSDL. Но уже на тот момент технология считалась устаревшей и не очень дружила с .NET Core в части создания сервера. А на тот момент .NET Core стал нашим основным стеком.

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

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

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

Мы стали подумывать о каком-то гибридном варианте, при котором потребители сами смогут определять, какие данные им нужны от поставщиков (Consumer Driven Contracts). Присматривались к таким технологиям как oData, но примерно в это время на сцене появилась технология GraphQL.

Если быть точным, то сама технология появилась в 2022 году, а в тот момент, как говорят наши архитекторы, она уже зеленела на техрадаре. Наши исследования и эксперименты показали, что технология предоставляет решения к обозначенным выше проблемам «из коробки», хотя и была довольно сыровата на тот момент.

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

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

Реализаций у этого стандарта может быть несколько. На тот момент, когда мы начинали создавать платформу, основной стек разработки на бэке был .Net (сегодня добавилась Java) и в качестве основной имплементации была выбрана библиотека graphql-dotnet.

Выбор учетной записи

После входа в систему вы можете продолжить работу со своей личной учетной записи либо заполнить профиль вашей компании:

При заполнении профиля компании укажите ее название, электронную почту, номер телефона, страну и город. Также вы должны указать канал или группу организации. Вы можете указать канал или группу, только если являетесь их владельцем. Администраторы смогут управлять всеми созданными вами объявлениями (можно дать им доступ).

При заполнении личного профиля укажите имя, электронную почту, номер телефона, город и страну:

После входа вы можете нажать Create a new ad («Создать новое объявление»), чтобы создать объявление, или Manage budget («Управление бюджетом»), чтобы пополнить баланс.

И снова про авторизацию

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

Как жестко будут модерироваться объявления

Telegram представил широкий список тем, подлежащих запрету. Кроме того, правила коснулись и форматирования. Нельзя использовать капс, кодировку Unicode и ASCII, маркированные списки и многое другое.

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

Как работать с telegram ad platform

Давайте посмотрим, как выглядит рекламный кабинет Telegram Ad Platform и что там можно сделать.

Контракты

Кроме того, возникала проблема обмена знаниями о контрактах сервиса с потребителями. Отправлять клиента на какую-то wiki-страницу во внутренней сети с неактуальной документацией случалось, наверное, каждому разработчику. Если нет, значит, возможно, доводилось быть в еще более неприятной ситуации.

Похожее:  Как мы увеличили процент регистраций на 68% с помощью дизайна форм / Хабр

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

У нас давно практикуется документация кода xml-комментариями. Поэтому, предоставив разработчикам такой инструмент, мы получали описание API прямо в коде, которое менялось одновременно с самим кодом и позволяло иметь максимально актуальную информацию о сервисах и их контрактах.

Мультиплатформенность

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

Особенности конкретных реализаций graphql

Довольно нетривиально оказалось «подружить» GraphQL с Security Proxy, который инкапсулирует в себе логику авторизации.

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

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

В самом стандарте предопределены три директивы: серверная deprecated и клиентские skip и include. Можно было разметить схему дополнительными кастомными директивами, но стандарт не представлял никаких четких указаний по передаче этих директив в интроспекции.

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

Долгое время в качестве решения мы использовали форк от официального репозитория, в котором были сделаны необходимые изменения. А именно, были добавлены дополнительные типы, описывающие директивы (__AppliedDirective) и тип ее аргументов (__DirectiveArgument).

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

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

Ошибка в выборе формата

Поначалу мы записывали названия ролей и операций в GT текстом. GT в свою очередь помещался в Header запроса. Очень быстро получили такую проблему: Header увеличивался в размерах и стал превышать дефолтное значение нашего маршрутизатора, которое составляло 4Кб.

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

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

Первые шаги по созданию авторизации

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

Субъекты можно было группировать по каналу, из которого они получали доступ. И организовать схему доступа вокруг этого. Когда-то мы именно так и делали. Выглядело это так: множество бэковых систем накрывается неким фасадом — API Gateway, где происходит аутентификация пользователей, которые, в свою очередь, обращаются к нему с фронта.

Такой подход имеет право на существование, хотя и обладает рядом минусов, среди которых можно выделить:

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

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

Нам пришлось писать для них отдельный адаптер и контролировать доступ к сервисам нашей системы через него.

Так как авторизация на сервисах отсутствует, мы имеем потенциальную дыру в безопасности. Если скомпрометировать API Gateway (а их потенциально может быть несколько, для каждого фронта свой шлюз) или какой-то компонент из внутреннего сегмента сети, то будет получен полный доступ к множеству сервисов.

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

Пополнение баланса

Если у вас на счету нет средств, то после создание объявления вы увидите такую надпись:

Нажмите на кнопку Add funds («Добавить средства») и переходите к пополнению баланса. Объявление будет сохранено как черновик, чтобы вы могли быстро опубликовать его после зачисления средств.

Чтобы протестировать платформу, вы можете опубликовать объявление без зачисления средств, а затем пополнить счет, когда будете готовы запускать рекламу.

Также можете получить доступ к интерфейсу, открыв страницу Manage Budget («Управление бюджетом») и нажав Add funds («Добавить средства»).

Заполните все поля на открывшейся странице:

Укажите, прямой ли вы рекламодатель или агентство, какие товары или услуги вы планируете рекламировать и на каком языке, примерный рекламный бюджет на год, дополнительную информацию:

Нажмите Send Request и отправьте запрос. После этого команда Telegram проверит информацию и свяжется с вами через сервисный аккаунт в Telegram. Вы получите необходимые документы для заключения договора и перевода депозита. Каждый раз при зачислении средств на счет вы будете получать подтверждение в Telegram.

Предыстория, или как мы стали платформой

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

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

Например:

  1. Звонок с предложением услуги из контакт-центра;

  2. Заполнение заявки на сайте или в мобильном приложении;

  3. Заключение сделки в отделении.

Такое развитие CJM обусловило необходимость иметь контекст пользователя и клиента. Для приложения в целом было принято решение сосредоточить логику создания и сопровождения продуктов в едином слое, к которому обращались множество фронтов. Этот слой был назван Digital Platform.

Проблематика

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

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

Похожее:  Как определить, истек ли токен OAuth?

Возьмем для примера гипотетическую систему согласования договоров крупной компании, типовой кровавый энтерпрайз. Практически наверняка возникнут следующие требования к авторизации от бизнеса:

  1. Пользователь, не имеющий отношения к конкретному договору, не должен его видеть в системе
  2. Автор договора должен видеть его на всех этапах.
  3. Создавать договор имеет право пользователь с грейдом не ниже 10.
  4. Визирующий должен видеть договор, начиная с поступления к нему на этап и далее.
  5. Руководители подразделений должны видеть договоры своих подразделений вверх по иерархии.
  6. Автор договора и руководитель подразделения имеют право отозвать договор на любом этапе согласования.
  7. Руководство и секретариат головного офиса должны видеть документы всех филиалов.
  8. Пользователь, создавший договор, не должен иметь права его завизировать.

От безопасности мы могли бы получить следующие требования

  1. Знать, кто имеет доступ к конкретному договору.
  2. Знать, кто имел доступ к конкретному договору в заданный момент времени.
  3. Лишать пользователя доступа к ранее доступным документам при изменении его должностных обязанностей.

Думаю, разработчикам уже стало страшно :). Дополнительную боль доставляет высокая изменчивость этих требований. Кстати, по статистике одного большого франча 1С – дополнительные требования по авторизации — одна из самых частых задач по кастомизации типовых конфигураций.

Итак, обозначим, почему эти требования проблемные:

Проекции

Кроме проблемы авторизации, стоял вопрос создания оптимальной проекции данных для каждого потребителя. Предоставляя публичный API, мы постоянно получали просьбы о его доработке под того или иного потребителя, потому что каждому потребителю требовался свой набор получаемых данных (проекция).

У нас оставалось только два решения:

  1. Создавать такие API, которые возвращали бы сущности целиком со всеми степенями вложенности, а потребители сами решали бы, какие подмножества (проекции) им использовать для своих нужд. Это порождает новую проблему, которая называется overfetching данных. Очевидным минусом такого подхода являются тяжелые DTO, передаваемые по сети;

  2. Создавать такие API, которые возвращали бы только атомарные сущности (только один уровень вложенности). При таком подходе потребителям, чтобы сформировать у себя требуемую проекцию данных, пришлось бы посылать несколько запросов. Эта проблема также известна как underfetching данных.

На самом деле есть и третий путь — проектировать API таким образом, чтобы для каждого потребителя была возможность возвращать свой набор данных. Другими словами, свое API для каждого из потребителей. Но это достаточно трудоемкая задача, даже если вы работаете всего с тремя клиентами.

Пути решения

Решить данную задачу нам помогают разработанные модели управления доступом:

MAC — мандатная модель управления доступом. Доступ субъекта к объекту определяется его уровнем доступа: уровень доступа субъекта должен быть не ниже уровня секретности объекта.

DAC — прямое управление доступом. Доступ субъекта к объекту определяется наличием субъекта в списке доступа (ACL) объекта.

RBAC — ролевая модель управления доступом. Доступ субъекта к объекту определяется наличием у субъекта роли, содержащей полномочия, соответствующие запрашиваемому доступу.

АВАС — атрибутивная модель управления доступом. Доступ субъекта к объекту определяется динамически на основании анализа политик учитывающих значения атрибутов субъекта, объекта и окружения. Сюда же относятся PBAC, RAdAC, CBAC, с некоторыми нюансами (шикарный обзор от CUSTIS).

Их крайне рекомендуется использовать в первозданном виде, не изобретая велосипед. Достаточно часто в сложных информационных системах используется комбинация моделей. Например, популярна комбинация ACL RBAC, когда роль включается в список доступа. Однако, правильное применение готовых моделей — тоже не простая задача.

Для реализации озвученных выше в разделе «Проблематика» требований, на первый взгляд, я бы выбрал комбинацию PBAC ACL. Требования могли бы быть реализованы следующим образом:

Перечисленные требования ИБ без всяких проблем реализуются с использованием ACL, однако бизнес-требования 5 и 7 мы реализуем с помощью PBAC. Так что для реализации требований ИБ 1 и 2 придется добавить к ним журнал или аналогичный механизм, поскольку при всей своей красоте динамические правила плохо аудируются:

Разграничение доступа на уровне отдельных ресурсов (attribute-based access control)

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

Так как мы заранее не знали, какие роли в системе у нас будут, предполагалась их активное добавление и изменение, этот подход показался нам более подходящим, чем первый. Управление уровнями доступа пользователей в одном месте сильно уменьшало стоимость поддержки. Более подробно про RBAC и ABAC можно почитать, например, тут.

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

Разграничение доступа на уровне роли (role-based access control)

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

За:

Плюсами такого подхода мы считали то, что, во-первых, он был довольно популярен на тот момент и де-факто являлся стандартом, во-вторых, как следствие первого, в ASP .Net MVC функционал был доступен «из коробки» (Identity Framework).

Против:

Главным минусом для нас являлось то, что при добавлении новой роли нужно было в явном виде обозначить в коде все методы, к которым роль должна иметь доступ. Что при активном добавлении ролей постоянно приводило бы к ковровым изменениям в коде. Такая проблема решалась путем создания атомарных ролей (например, в разрезе операций), объединения их в группы и создания из них уже более крупных пользовательских, но все это довольно сложно администрировать и поддерживать.

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

Редактирование учетной записи

Чтобы открыть меню, кликните по имени в правом верхнем углу:

Здесь вы можете изменить информацию о своей учетной записи, добавить новую компанию, сменить учетную запись или выйти из системы. В разделе Edit Account Info («Изменить информацию об учетной записи») вы можете изменить свои личные данные, например адрес электронной почты. Также вы можете кликнуть по вкладке Budget («Бюджет»), чтобы увидеть полную историю транзакций по вашей учетной записи.

Рекламная платформа Telegram позволяет пользоваться системой с аккаунтов разных организаций, а также со своей личной рекламной учетки. Чтобы сменить учетную запись, кликните свое имя в правом верхнем углу и выберите в меню Switch to («Переключиться на…»).

Создание объявления

Нажмите Create a new ad («Создать новое объявление»), чтобы приступить к созданию своего рекламного объявления. Там вы увидите шаблон с несколькими полями, которые нужно заполнить.

Заголовок и текст

1. Укажите название объявления. Его будете видеть только вы.

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

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

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

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

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

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

Похожее:  Когда контекст доступа важен: авторизация в микросервисной платформе на GraphQL / Хабр

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

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

#стартапдня

Текущая реальность и планы развития

Используя такую комбинацию технологий, мы получили комплексное решение со стороны безопасности и архитектуры:

  • Независимый от конкретного языка программирования механизм авторизации для компонентов системы (Digital Platform). Следуй стандарту, используй GraphQL, размечай поля директивами – и вперед;

  • Разделили авторизацию и бизнес-логику на уровне архитектуры. Разработчики доменных сервисов сосредоточены на создании бизнес-функционала и не думают о деталях реализации авторизации;

  • Позволили владельцам сервисов сосредоточиться на логике их реализации и не фокусироваться на том, какие именно проекции данных могут потребоваться конкретным потребителям;

  • Удобное управление ролями через внешний сервис, которое не блокируется развитием сервисов и само не блокирует их;

  • Оценить плюсы такого подхода как Sidecar, который позволил независимо релизить различные компоненты системы. Настоятельно рекомендую присмотреться к той части приложения, которую вы распространяете как библиотека, и вынести ее в Sidecar. Это особенно актуально для активно развивающихся систем, которые часто релизятся в процессе непрерывной поставки;

  • Популяризировать внутри организации современную технологию. Что ни говорите, а банки традиционно относят к консервативным структурам, тогда как современные разработчики любят «стильно, модно, молодежно» пробовать новые решения и технологии.

  • Повышение Multitenancy — возможности повторно использовать компоненты системы гораздо шире, чем рамки одного проекта и даже организации. Активность в этом направлении (платформизация) позволяет нам экономить на создании типовых решений при запуске новых продуктов.

Надеемся, что история была интересной и наш опыт будет полезен для вас.

Управление рекламой

Статус объявления

После запуска объявление будет отображаться в списке на главной странице вашей учетной записи. Сообщение может иметь следующие статусы:

  • Stopped. Это статус по умолчанию. Он отображается для всех новых объявлений без бюджета. Также объявление будет иметь статус Stopped, если его бюджет исчерпан;
  • In Review. Статус присваивается объявлениям, которые находятся на проверке у модераторов;
  • Declined. Статус означает, что перед публикацией вам нужно изменить объявление. Чтобы увидеть ссылку на правила и подробное объяснение, нужно открыть объявление;
  • Active. Ваши объявления появляются в Telegram в соответствии с заданными параметрами;
  • On Hold. Показ объявления приостановлен. Вы можете снова запустить рекламу, когда захотите.

Информация об объявлении

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

Рекламный бюджет

Чтобы увеличить бюджет объявления, кликните поле Current Budget («Текущий бюджет»). Вы также можете увеличить или уменьшить стоимость за тысячу показов в поле CPM («Цена за тысячу показов»). Если хотите удалить объявление (например, чтобы повторно отправить его с меньшим бюджетом или новыми параметрами таргетинга)

Увеличить бюджет можно на вкладке Budget («Бюджет»). На вкладке также представлена история транзакций, показывающая расходы на рекламное объявление, а также любые увеличения бюджета, включая время и сумму увеличения.

Статистика

На вкладке Statistics («Статистика») вы увидите обзор кампании, например дату создания объявления, цену за тысячу показов, бюджет и количество просмотров. Внизу расположен подробный график. На нем можно посмотреть просмотры сообщения и количество переходов по ссылке по минутам или дням.

Форма авторизации на простом html с пояснениями

Добрый день. Конечно всем эта тема знакома уже много лет, но она будет кому то полезна особенно новичкам, которые ищут форму авторизации. Формы бывают разные и я буду добавлять новые, чтобы кто то не тратил много времени на поиски готовых решений. Это будут формы авторизации из двух полей, форма авторизации по номеру телефона, форма авторизации с “галочкой” запомнить, а так же формы авторизации с капчей от гугл. Еще добавлю, что все формы будут иметь уникальные классы блоков, что позволит их использовать на любых проектах, чтобы не ломать действующие возможные стили и пересечения классов блоков.

Базовая разметка HTML для простой формы авторизации:

<div class="form_auth_block">
  <div class="form_auth_block_content">
    <p class="form_auth_block_head_text">Авторизация</p>
    <form class="form_auth_style" action="#" method="post">
      <label>Введите Ваш имейл</label>
      <input type="email" name="auth_email" placeholder="Введите Ваш имейл" required >
      <label>Введите Ваш пароль</label>
      <input type="password" name="auth_pass" placeholder="Введите пароль" required >
      <button class="form_auth_button" type="submit" name="form_auth_submit">Войти</button>
    </form>
  </div>
</div>

В данной разметке мы создали простой блок родитель в котором будут храниться все остальные блоки, как видно их не так много. Блоки названы одноименными классами, так легче понять о чем идет суть и какие стили к чему относятся в структуре. Обратите внимание на type для двух input, поскольку первый является полем для ввода имейл адреса его тип выбран как email это позволит пользователю в простой проверке браузера избежать ошибки к примеру в отсутствии @ или попросту точки перед доменной зоной.

Второй input имеет тип password это скрывает пароль от глаз в виде точек. Это не так критично, многие предпочитают тип text, но правильнее все же будет использовать тип password, о других нюансах выбора типа поля input будет рассказано в другой статье.

Placeholder — простым словом “тег подсказка”, он дает возможность указать для пользователя что ему требуется сделать, что разрешено, а что нет. Можно указать любое значение. Обратите внимание что тег placeholder можно изменить с помощью стилей CSS.

Обратите внимание что в input так же задано свойство name, оно необходимо для последующей работы с формой, когда дело доходит до ее обработки на сервере. Это значение нужно делать уникальным и желательно схожим по названию отражающем его сущность. Если это форма авторизации, то логичнее всего задать name=”auth_email”, таким образом мы будем понимать что это свойство отвечает за передачу email адреса из формы авторизации. Многие новички в последующем делают частую ошибку работая с обработкой этих данных на сервере, особенно работая по паттерну MVC, когда в контроллере срабатывает событие к примеру submit а данные свойства name остаются везде одинаковые к примеру name=”email”.

Простые стили к форме авторизации без адаптации под мобильные устройства:

.form_auth_block{
    width: 500px;
    height: 500px;
    margin: 0 auto;
    background: url(http://www.dailycompass.org/wp-content/uploads/2022/01/Bubbles.jpg);
    background-size: cover;
    border-radius: 4px;
}
.form_auth_block_content{
  padding-top: 15%;
}
.form_auth_block_head_text{
    display: block;
    text-align: center;
    padding: 10px;
    font-size: 20px;
    font-weight: 600;
    background: #ffffff;
    opacity: 0.7;
}
.form_auth_block label{
    display: block;
    text-align: center;
    padding: 10px;
    background: #ffffff;
    opacity: 0.7;
    font-weight: 600;
    margin-bottom: 10px;
    margin-top: 10px;
}
.form_auth_block input{
  display: block;
  margin: 0 auto;
  width: 80%;
  height: 45px;
  border-radius: 10px;  
  border:none;
  outline: none;
}
input:focus {
  color: #000000;
  border-radius: 10px;
  border: 2px solid #436fea;
}
.form_auth_button{
    display: block;
    width: 80%;
    margin: 0 auto;
    margin-top: 10px;
    border-radius: 10px;
    height: 35px;
    border: none;
    cursor: pointer;
}
::-webkit-input-placeholder {color:#3f3f44; padding-left: 10px;} // Это стили для placeholder
::-moz-placeholder          {color:#3f3f44; padding-left: 10px;} // Это стили для placeholder
:-moz-placeholder           {color:#3f3f44; padding-left: 10px;} // Это стили для placeholder
:-ms-input-placeholder      {color:#3f3f44; padding-left: 10px;} // Это стили для placeholder

И вот что у нас получилось в итоге:

image

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

Итого

Авторизация — незаслуженно обойденная вниманием тема, как в публикациях, так и непосредственно в процессе разработки. Двухфакторную аутентификацию по СМС к сайту прикрутит и ребенок. Правильно реализовать авторизацию в корпоративной системе, не наделав костылей — сложнейшая задача, о которую ломают копья сеньоры и архитекторы, а множество популярных коммерческих продуктов (к примеру, Atlassian Jira) стоят на костылях благодаря сложности требований.

Мы планируем серию статей, посвященных моделям авторизации и предмету в целом. Будем рады вопросам и предложениям по темам для рассмотрения.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector