Обзор
Для авторизации пользователей в собственных приложениях наилучшей текущей практикой является выполнение запроса авторизации OAuth во внешнем пользовательском агенте (обычно в браузере), а не во встроенном пользовательском агенте (например, реализованном с помощью веб-представлений).
Ранее нативные приложения обычно использовали встроенные пользовательские агенты (обычно реализуемые с веб-представлениями) для запросов авторизации OAuth. Этот подход имеет много недостатков, в том числе то, что хост-приложение может копировать учетные данные пользователя и файлы cookie, а также пользователя, которому требуется аутентификация с нуля в каждом приложении. См. Раздел 8.12 для более глубокого анализа недостатков использования встроенных пользовательских агентов для OAuth.
Собственные запросы авторизации приложений, использующие браузер, более безопасны и могут использовать состояние аутентификации пользователя. Возможность использовать существующий сеанс аутентификации в браузере обеспечивает единый вход, поскольку пользователям не нужно проходить аутентификацию на сервере авторизации каждый раз, когда они используют новое приложение (если этого не требует политика сервера авторизации).
Поддержка потоков авторизации между собственным приложением и браузером возможна без изменения самого протокола OAuth, поскольку запрос и ответ OAuth-авторизации уже определены в терминах URI. Это охватывает URI, которые можно использовать для связи между приложениями.
Некоторым реализациям сервера OAuth, которые предполагают, что все клиенты являются конфиденциальными веб-клиентами, потребуется добавить понимание общедоступных собственных клиентов приложений и типов URI перенаправления, которые они используют для поддержки этой передовой практики.
На рисунке 1 показано взаимодействие между собственным приложением и браузером для авторизации пользователя.
- Клиентское приложение открывает вкладку браузера с запросом авторизации.
- Конечная точка авторизации получает запрос авторизации, аутентифицирует пользователя и получает авторизацию. Аутентификация пользователя может включать связывание с другими системами аутентификации.
- Сервер авторизации выдает код авторизации для URI перенаправления.
- Клиент получает код авторизации от URI перенаправления.
- Клиентское приложение представляет код авторизации в конечной точке токена.
- Конечная точка токена проверяет код авторизации и выдает запрошенные токены.
12. Встроенные пользовательские агенты
В разделе 9 OAuth 2.0 [RFC6749] описаны два подхода для взаимодействия собственных приложений с конечной точкой авторизации. Эта лучшая текущая практика требует, чтобы собственные приложения НЕ ДОЛЖНЫ использовать встроенные пользовательские агенты для выполнения запросов на авторизацию, и позволяет конечным точкам авторизации МОГУТ предпринять шаги для обнаружения и блокировки запросов на авторизацию во встроенных пользовательских агентах. Соображения безопасности для этих требований подробно описаны здесь.
Встроенные пользовательские агенты являются альтернативным методом авторизации собственных приложений. Эти встроенные пользовательские агенты небезопасны для использования третьими сторонами на сервере авторизации по определению, так как приложение, в котором размещен встроенный пользовательский агент, может получить доступ к полным учетным данным пользователя, а не только к предоставлению авторизации OAuth, предназначенному для приложения.
В типичных реализациях встроенных пользовательских агентов, основанных на веб-просмотре, хост-приложение может записывать каждое нажатие клавиши, введенное в форму входа в систему, для захвата имен пользователей и паролей, автоматически отправлять формы для обхода согласия пользователя, а также копировать файлы cookie сеанса и использовать их для выполнения аутентификации. действия как пользователь.
Даже при использовании доверенными приложениями, принадлежащими к той же стороне, что и сервер авторизации, встроенные пользовательские агенты нарушают принцип наименьших привилегий, имея доступ к более мощным учетным данным, чем им нужно, что потенциально увеличивает поверхность атаки.
Поощрение пользователей вводить учетные данные во встроенном пользовательском агенте без обычной адресной строки и видимых функций проверки сертификатов, которые есть в браузерах, делает невозможным для пользователя узнать, заходят ли они на законный сайт; даже когда они есть, они учат, что можно вводить учетные данные без предварительной проверки сайта.
Помимо проблем безопасности, встроенные пользовательские агенты не делят состояние аутентификации с другими приложениями или браузером, требуя, чтобы пользователь входил в систему для каждого запроса авторизации, что часто считается плохим пользовательским интерфейсом.
Этот документ не требует никаких действий IANA.
Раздел 7.1 определяет, как схемы URI частного использования используются для взаимодействия interpp в потоках протокола OAuth. Этот документ требует в Разделе 7.1, что такие схемы основаны на доменных именах, принадлежащих или назначенных приложению, как рекомендуется в Разделе 3.8 [RFC7595]. В соответствии с разделом 6 [RFC7595] регистрация доменных схем URI в IANA не требуется.
В.3. детали реализации windows
Как традиционные приложения, так и приложения универсальной платформы Windows (UWP) могут выполнять запросы авторизации в браузере пользователя. Традиционные приложения обычно используют перенаправление петли для получения ответа на авторизацию, а прослушивание на интерфейсе петли разрешено правилами брандмауэра по умолчанию.
Приложения UWP могут использовать перенаправления схемы URI частного использования, чтобы получить ответ авторизации от браузера, который выведет приложение на передний план. Схема URI, известная на платформе как «Активация URI», имеет длину не более 39 символов и может включать «.» символ, что делает возможным использование коротких обратных доменных схем (как требуется в разделе 7.1).
Приложения UWP могут альтернативно использовать API-интерфейс брокера веб-аутентификации в режиме единого входа (SSO), который является внешним агентом пользователя, предназначенным для потоков авторизации. Файлы cookie распределяются между вызовами брокера, но не в браузере, который предпочитает пользователь.
Это означает, что пользователю необходимо будет снова войти в систему, даже если у него есть активный сеанс в браузере; но сеанс, созданный в посреднике, будет доступен для последующих приложений, использующих посредник. Персонализация, которую пользователь сделал в своем браузере, например, настройка менеджера паролей, может быть недоступна в брокере. Чтобы квалифицироваться как внешний пользовательский агент, брокер ДОЛЖЕН использоваться в режиме SSO.
Чтобы использовать брокер веб-аутентификации в режиме единого входа, URI перенаправления должен иметь форму «msapp: // {appSID}», где «{appSID}» – это идентификатор безопасности приложения (SID), который можно найти при регистрации приложения. информацию или путем вызова метода “GetCurrentApplicationCallbackUri”.
В то время как Windows применяет полномочия URI для таких перенаправлений, гарантируя, что только приложение с соответствующим SID может получить ответ в Windows, схема URI может быть запрошена приложениями на других платформах без таких же прав доступа; таким образом, этот тип перенаправления должен рассматриваться аналогично перенаправлениям схемы URI частного использования в целях безопасности.
Образец с открытым исходным кодом, демонстрирующий эти шаблоны, доступен [SamplesForWindows].
Использование Inter-App URI Communication для OAuth
Точно так же, как URI используются для OAuth 2.0 [RFC6749] в Интернете для инициирования запроса авторизации и возврата ответа на запрос авторизации на веб-сайт запрашивающего сайта, URI могут использоваться собственными приложениями для инициирования запроса авторизации в браузере устройства и возврата ответа на запрос. запрашивающее нативное приложение.
Принимая те же методы, которые используются в Интернете для OAuth, преимущества, наблюдаемые в веб-контексте, такие как удобство использования сеанса единого входа и безопасность отдельного контекста аутентификации, также получают в собственном контексте приложения.
Чтобы соответствовать этому передовому опыту, нативные приложения ДОЛЖНЫ использовать внешний пользовательский агент для выполнения запросов на авторизацию OAuth. Это достигается открытием запроса авторизации в браузере (подробно описано в Разделе 6) и использованием URI перенаправления, который возвращает ответ авторизации обратно в собственное приложение (определено в Разделе 7).
Родные приложения, которым требуется авторизация пользователя, создают URI запроса авторизации с типом предоставления кода авторизации в соответствии с разделом 4.1 OAuth 2.0 [RFC6749], используя URI перенаправления, который может быть получен собственным приложением.
Функция URI перенаправления для собственного запроса авторизации приложения аналогична функции веб-запроса авторизации. Вместо того, чтобы возвращать ответ авторизации на сервер клиента OAuth, URI перенаправления, используемый собственным приложением, возвращает ответ приложению.
Несколько вариантов для URI перенаправления, который будет возвращать ответ авторизации для собственного приложения на разных платформах, описаны в разделе 7. Любой URI перенаправления, который позволяет приложению получать URI и проверять его параметры, является жизнеспособным.
Общедоступные нативные клиенты приложений ДОЛЖНЫ реализовывать расширение Proof Key for Code Exchange (PKCE [RFC7636]) для OAuth, и серверы авторизации ДОЛЖНЫ поддерживать PKCE для таких клиентов по причинам, подробно изложенным в разделе 8.1.
Глава 4. аутентификация, часть 1
Аутентификация с помощью ключа API — это метод, который преодолевает слабость использования общих учетных данных, требуя доступа к API с помощью уникального ключа. В этой схеме ключ обычно представляет собой длинную последовательность букв и цифр, отличную от пароля для входа владельца учетной записи. Владелец дает ключ клиенту, так же как отель дает гостю ключ от одноместного номера.
Когда клиент аутентифицируется с помощью ключа API, сервер понимает, что можно разрешить клиенту доступ к данным, но теперь имеет возможность ограничить административные функции, такие как изменение паролей или удаление учетных записей. Иногда ключи используются просто, чтобы пользователю не приходилось выдавать свой пароль. Гибкость обеспечивается аутентификацией API Key для ограничения контроля, а также защиты паролей пользователей.
Итак, где же находится ключ API? Заголовок для него тоже есть, да? К сожалению, нет. В отличие от Basic Auth, который является установленным стандартом со строгими правилами, ключи API были разработаны в нескольких компаниях на заре интернета. В результате аутентификация с помощью ключа API немного похожа на дикий запад; у каждого свой способ делать это.
Однако со временем появилось несколько общих подходов. Один из них заключается в том, чтобы клиент поместил ключ в заголовок Авторизации вместо имени пользователя и пароля. Другой — добавить ключ в URL-адрес (http://example.com? api_key=my_secret_key ). Реже ключ закапывают где-нибудь в теле запроса рядом с данными. Куда бы ни пошел ключ, эффект будет одинаковым — он позволяет серверу аутентифицировать клиента.
7. Поддельные внешние агенты пользователя
Собственное приложение, которое инициирует запрос на авторизацию, обладает большой степенью контроля над пользовательским интерфейсом и может потенциально представлять поддельный внешний пользовательский агент, то есть встроенный пользовательский агент, предназначенный для отображения в качестве внешнего пользовательского агента.
Когда все хорошие субъекты используют внешних пользовательских агентов, преимущество заключается в том, что эксперты по безопасности могут обнаруживать плохих участников, поскольку всякий, кто подделывает внешнего пользовательского агента, доказуемо плох.
С другой стороны, если как хорошие, так и плохие актеры используют встроенные пользовательские агенты, плохим актерам не нужно ничего подделывать, что затрудняет их обнаружение. После обнаружения вредоносного приложения можно использовать эти знания для внесения в черный список сигнатуры приложения в программном обеспечении для сканирования на наличие вредоносных программ, выполнения действий по удалению (в случае приложений, распространяемых магазинами приложений) и других действий, направленных на уменьшение воздействия и распространения вредоносное приложение.
Серверы авторизации также могут напрямую защищать от поддельных внешних пользовательских агентов, требуя, чтобы фактор аутентификации был доступен только для настоящих внешних пользовательских агентов.
Пользователи, которые особенно обеспокоены своей безопасностью при использовании вкладок браузера в приложении, могут также сделать дополнительный шаг – открыть запрос в полном браузере на вкладке браузера в приложении и завершить там авторизацию, как и большинство реализаций в приложении. шаблон вкладки браузера предлагают такую функциональность.
Беспарольная аутентификация
Первой реакцией на термин «беспарольная аутентификация» может быть «Как аутентифицировать кого-то без пароля? Разве такое возможно?»
В наши головы внедрено убеждение, что пароли — абсолютный источник защиты наших аккаунтов. Но если изучить вопрос глубже, то выяснится, что беспарольная аутентификация может быть не просто безопасной, но и безопаснее традиционного входа по имени и паролю. Возможно, вы даже слышали мнение, что пароли устарели.
Беспарольная аутентификация — это способ конфигурирования процедуры входа и аутентификации пользователей без ввода паролей. Идея такая:
Вместо ввода почты/имени и пароля пользователи вводят только свою почту. Ваше приложение отправляет на этот адрес одноразовую ссылку, пользователь по ней кликает и автоматически входит на ваш сайт / в приложение. При беспарольной аутентификации приложение считает, что в ваш ящик пришло письмо со ссылкой, если вы написали свой, а не чужой адрес.
Есть похожий метод, при котором вместо одноразовой ссылки по SMS отправляется код или одноразовый пароль. Но тогда придётся объединить ваше приложение с SMS-сервисом вроде twilio (и сервис не бесплатен). Код или одноразовый пароль тоже можно отправлять по почте.
И ещё один, менее (пока) популярный (и доступный только на устройствах Apple) метод беспарольной аутентификации: использовать Touch ID для аутентификации по отпечаткам пальцев. Подробнее о технологии.
Если вы пользуетесь Slack, то уже могли столкнуться с беспарольной аутентификацией.
9. Защита от подделки запросов между приложениями
В разделе 5.3.5 [RFC6819] рекомендуется использовать параметр «state» для связывания клиентских запросов и ответов для предотвращения атак CSRF (межсайтовая подделка запросов).
Чтобы смягчить атаки в стиле CSRF по каналам связи URI между приложениями (так называемый «подделка запросов между приложениями»), аналогичным образом РЕКОМЕНДУЕТСЯ, чтобы нативные приложения включали безопасное случайное число с высокой энтропией в параметре «state» запроса авторизации. и отклонить любые входящие ответы на авторизацию без значения состояния, которое соответствует ожидающему исходящему запросу на авторизацию.
Для защиты от скомпрометированного или злонамеренного сервера авторизации, атакующего другой сервер авторизации, используемый тем же приложением, ТРЕБУЕТСЯ, чтобы уникальный URI перенаправления использовался для каждого сервера авторизации, используемого приложением (например, путем изменения компонента пути), и чтобы ответы на авторизацию отклоняются, если URI перенаправления, на который они были получены, не соответствуют URI перенаправления в исходящем запросе авторизации.
Собственное приложение ДОЛЖНО хранить URI перенаправления, использованный в запросе авторизации, с данными сеанса авторизации (то есть вместе с «состоянием» и другими связанными данными) и ДОЛЖНО проверять, что URI, на который был получен ответ авторизации, точно соответствует ему.
Требование Раздела 8.4, а именно, что серверы авторизации отклоняют запросы с URI, которые не соответствуют зарегистрированным, также необходимы для предотвращения таких атак.
Выбираем правильное хэширование
Идею хранения паролей нашли, то есть хранения не паролей, а их хэшей. А вот какой алгоритм хэширования выбрать?
Давайте посмотрим на то, что пробовали выше – простая функция md5. Алгоритма его расшифровки нет, но тем не менее md5 не рекомендуется для использования. Почему?
Помимо сложности самого алгоритма, есть и другой момент. Да, расшифровать пароль по хэшу нельзя, но его можно подобрать. Простым брутфорсом.
К тому же существуют многочисленные базы паролей md5, где всевозможные варианты хранятся тупо списком.
И подбор вашего пароля по известному хэшу займет столько времени, сколько понадобится для выполнения sql-запроса
select password from passwords where hash='e10adc3949ba59abbe56e057f20f883e';
Конечно, вы сами не будете использовать пароль 123456, но как насчет ваших пользователей? Да, 123456 можно подобрать и руками, но в таком случае никакие алгоритмы не помогут.
Наша же задача максимально позаботиться о юзерах, которые выбирают пароли сложнее qwerty. Думаем дальше, гуглим.
Помимо md5 есть множество алгоритмов хэширования, sha256, sha512 и еще целая толпа. Их сложность выше, но это не отменяет опять-таки существования таблиц с готовыми паролями.
Нужно что-то хитрее.
4. Регистрация нативных клиентов приложения
За исключением случаев использования механизма, такого как динамическая регистрация клиентов [RFC7591], для предоставления секретов для каждого экземпляра, собственные приложения классифицируются как публичные клиенты, как определено в разделе 2.1 OAuth 2.0 [RFC6749];
Серверы авторизации ДОЛЖНЫ требовать, чтобы клиенты регистрировали свой полный URI перенаправления (включая компонент пути), и отклоняли запросы на авторизацию, в которых указан URI перенаправления, который не совсем соответствует тому, который был зарегистрирован; Исключением являются петлевые перенаправления, где требуется точное соответствие, за исключением компонента URI порта.
Для переадресаций на основе схем URI для частного использования серверам авторизации СЛЕДУЕТ применять требование Раздела 7.1 о том, что клиенты используют схемы, основанные на обратном доменном имени. Как минимум, любая схема URI для частного использования, которая не содержит символа точки (“.”), ДОЛЖНА быть отклонена.
Что такое сессии?
Попробую рассказать в паре абзацев.
Сессии – это механизм, который позволяет однозначно идентифицировать пользователя.
По-человечески это значит, что для каждого посетителя сайта можно создать уникальное “хранилище”, к которому будет доступ только у этого самого посетителя.
Хранилище это хранится в файле на сервере.
На самом деле сессии хранятся не обязательно в файлах. Например, cms Modx хранит их базе данных.
Но сейчас нам это не важно, главное, что сессии предоставляют удобный способ работать с данными, уникальными для пользователя.
Для нас сессия выглядит как обычный ассоциативный массив под названием $_SESSION, в разные поля которого можно записать хоть число, хоть строку, хоть сериализованный объект.
Благодарности
Авторы хотели бы поблагодарить Мариуса Скуртеску (Marius Scurtescu) и Бена Уайли Ситтлера (Ben Wiley Sittler), чей дизайн для использования URI-схем частного использования в клиентах OAuth 2.0 для нативных приложений в Google лег в основу Раздела 7.1.
Следующие лица внесли идеи, отзывы и формулировки, которые сформировали и утвердили окончательную спецификацию:
Энди Змолек (Andy Zmolek), Стивен Е. Райт (Steven E. Wright), Брайан Кэмпбелл (Brian Campbell), Нат Сакимура (Nat Sakimura), Эрик Сакс (EricSachs), Пол Мэдсен (Paul Madsen), Иэн Макгиннисс (Iain McGinniss), Рахул Равикумар (Rahul Ravikumar), Брено де Медейрос (Breno deMedeiros)
, Ханнес Чофениг (Hannes Tschofenig), Ашиш Джейн (Ashish Jain), Эрик Уолстром (Erik Wahlstrom), Билл Фишер (BillFisher), Судхи Умарджи (Sudhi Umarji), Майкл Б. Джонс (Michael B. Jones), Витторио Берточчи (Vittorio Bertocci), Дик Хардт (DickHardt)
1. Частное перенаправление схемы URI
Многие мобильные и настольные вычислительные платформы поддерживают взаимодействие между приложениями через URI, позволяя приложениям регистрировать схемы URI частного использования (иногда в разговорной речи называемые «пользовательскими схемами URL»), например «com.example.app».
Чтобы выполнить запрос авторизации OAuth 2.0 с перенаправлением схемы URI частного использования, собственное приложение запускает браузер со стандартным запросом авторизации, но тот, в котором URI перенаправления использует схему URI частного использования, зарегистрированную в операционной системе.
При выборе схемы URI для связи с приложением приложения ДОЛЖНЫ использовать схему URI, основанную на доменном имени, находящемся под их контролем, в обратном порядке, как рекомендовано в разделе 3.8 [RFC7595] для схем URI частного использования.
5. Аутентификация клиента
Секреты, которые статически включены как часть приложения, распространяемого среди нескольких пользователей, не должны рассматриваться как конфиденциальные секреты, так как один пользователь может проверить свою копию и узнать общий секрет. По этой причине и тем, которые указаны в Разделе 5.3.
1 [RFC6819], для серверов авторизации НЕ РЕКОМЕНДУЕТСЯ требовать аутентификации клиента общедоступных клиентов собственных приложений, использующих общий секрет, так как это служит небольшим значением помимо идентификации клиента, которая уже предоставлена. по параметру запроса “client_id”.
Серверы авторизации, которым все еще требуется статически включенный общий секрет для собственных клиентов приложения, ДОЛЖНЫ рассматривать клиента как общедоступного клиента (как определено в разделе 2.1 OAuth 2.0 [RFC6749]) и не принимать секрет в качестве подтверждения личности клиента. Без дополнительных мер такие клиенты могут быть олицетворены (см. Раздел 8.6).
Oauth для полностью клиентских приложений
Стороннее приложение может представлять собой лишь графический интерфейс без серверной бизнес-логики и выполнять взаимодействие с сервисом API с помощью кода на клиенте — например, мобильное приложение календаря, заметок и т.д.
Схема процесса авторизации приведена ниже. Отметим, что приложению без серверной части необходимо создать виртуальное окно браузера для взаимодействия с пользователем в части подтверждения выдачи прав.
Сначала в виртуальном браузере приложения открывается страница авторизации, где пользователь должен подтвердить делегирование прав доступа к своему аккаунту приложению. Если подтверждение получено, происходит редирект пользователя на страницу-заглушку, в части адреса которой указан access_token.
При таком подходе опускается обмен кода авторизации на токен доступа во время обмена запросами между серверами приложения и API. Вся авторизация, как было отмечено ранее, происходит на стороне клиента.
Терминология
В дополнение к терминам, определенным в ссылочных спецификациях, в этом документе используются следующие термины:
native app – (App или Application) – это собственное приложение, которое пользователь устанавливает на свое устройство, в отличие от веб-приложения, которое работает только в контексте браузера. Приложения, реализованные с использованием веб-технологий, но распространяемые как собственные приложения, так называемые «гибридные приложения», считаются эквивалентными собственным приложениям для целей данной спецификации.
app – «Нативное приложение», если не указано иное.
app store – Интернет-магазин, где пользователи могут загружать и покупать приложения.
OAuth – Протокол авторизации, указанный в OAuth 2.0 Framework Authorization Framework [RFC6749 #].
Двухфакторная аутентификация (2fa)
Двухфакторная аутентификация (2FA) улучшает безопасность доступа за счёт использования двух методов (также называемых факторами) проверки личности пользователя. Это разновидность многофакторной аутентификации. Наверное, вам не приходило в голову, но в банкоматах вы проходите двухфакторную аутентификацию: на вашей банковской карте должна быть записана правильная информация, и в дополнение к этому вы вводите PIN.
Если кто-то украдёт вашу карту, то без кода он не сможет ею воспользоваться. (Не факт! — Примеч. пер.) То есть в системе двухфакторной аутентификации пользователь получает доступ только после того, как предоставит несколько отдельных частей информации.
Как работает oauth 2: от запроса на авторизацию до генерации токена
Рассмотрим схему, описывающую принцип действия протокола.
Выделим следующие шаги:
- Приложение запрашивает у пользователя разрешение на доступ к серверу ресурсов.
- После получения разрешения приложение сообщает об этом авторизационному серверу, а также предоставляет ему сведения о себе.
- Сервер авторизации проверяет подлинность разрешения и предоставленных сведений о приложении. В случае успешной проверки генерируется токен доступа.
- Далее приложение обращается к серверу ресурсов, предоставляя токен в качестве подтверждения пройденной авторизации.
- Сервер ресурсов проверяет действительность токена и выдает приложению доступ к запрашиваемому ресурсу.
В зависимости от бизнес-логики клиентского приложения последовательность шагов может меняться. Далее рассмотрим наиболее распространенные примеры использования OAuth 2.
Используемые роли в oauth 2
В рамках описываемого протокола выделяются следующие типы ролей:
- владелец (пользователь): авторизует клиентское приложение на доступ к данным своего аккаунта;
- сервер ресурсов/API: здесь располагаются данные пользовательских аккаунтов, а также бизнес-логика авторизации, отвечающая за выдачу новых OAuth-токенов и проверку их подлинности при обращении клиентских приложений к ресурсам. Целесообразно объединять эти роли, так как физически это один сервис;
- клиентское приложение: собственно сервис, которому пользователь делегирует права доступа к своим данным на сервере ресурсов. Пользователь должен авторизовать приложение, а со стороны сервера API оно должно получить подтверждение в виде ключа (токена) доступа.
Введение
В разделе 9 инфраструктуры авторизации OAuth 2.0 [RFC6749] описаны два подхода для взаимодействия собственных приложений с конечной точкой авторизации: встроенный пользовательский агент и внешний пользовательский агент.
Эта лучшая текущая практика требует, чтобы только внешние агенты пользователя, такие как браузер, использовались для OAuth нативными приложениями. Он документирует, как собственные приложения могут реализовывать потоки авторизации с использованием браузера в качестве предпочтительного внешнего агента пользователя, а также требования к серверам авторизации для поддержки такого использования.
Эта практика также известна как «шаблон AppAuth» со ссылкой на библиотеки с открытым исходным кодом [AppAuth], которые его реализуют.
В.4. детали реализации macos
Приложения могут инициировать запрос авторизации в браузере пользователя по умолчанию, используя API-интерфейсы платформы для открытия URI в браузере.
Для получения ответа на авторизацию схемы URI для частного использования являются хорошим выбором для перенаправления URI в macOS, поскольку пользователь возвращается обратно в приложение, из которого он запустил запрос. Они регистрируются в списке свойств информации о пакете приложения с помощью ключа “CFBundleURLSchemes”.
Полный пример с открытым исходным кодом включен в библиотеку AppAuth для iOS и macOS [AppAuth.iOSmacOS].
Различия протоколов openid и oauth 2
Основное различие между этими двумя протоколами состоит в цели использования. Так, OpenID служит для аутентификации, то есть подтверждения личности пользователя в клиентском сервисе. Например, вы можете авторизоваться в любом из сервисов Google под своим аккаунтом и работать с ними от своего имени, со своими данными.
Для верификации пользователя OpenID использует ID учетной записи у провайдера, а OAuth — авторизационные ключи (токены) с предопределенным сроком действия и правами доступа.
Процессы аутентификации
Так как наши данные при регистрации в каком либо сервисе хранятся в базе данных – то к процессу аутентификации применяются базовые принципы работы с базами данных (далее БД) – это чтение, запись, обновление и удаление данных. При этом, во время каждого из действий с БД проверяется возможность совершения этих действий пользователем.
Регистрация (CREATE) – создание в системе вашей личной учётной записи
Авторизация (READ) – получение доступа к вашей личной учётной записи
Восстановление доступа к учётной записи (UPDATE) – если вы на пример забыли пароль – то его можно сменить, подтвердив свою личность.
Удаление (DELETE) – удаление вашей учётной записи из системы
В.2. детали реализации android
Приложения могут инициировать запрос авторизации в браузере, не выходя из приложения, с помощью функции пользовательских вкладок Android, которая реализует шаблон вкладки браузера в приложении. Пользовательский браузер по умолчанию можно использовать для обработки запросов, когда ни один браузер не поддерживает пользовательские вкладки.
Поставщики браузеров Android должны поддерживать протокол пользовательских вкладок (предоставляя реализацию класса «CustomTabsService»), чтобы обеспечить оптимизацию пользовательского интерфейса вкладки браузера в приложении для своих пользователей. Chrome – один из таких браузеров, который реализует пользовательские вкладки.
Аутентификация на основе токенов
Аутентификация на основе токенов в последние годы стала очень популярна из-за распространения одностраничных приложений, веб-API и интернета вещей. Чаще всего в качестве токенов используются Json Web Tokens (JWT). Хотя реализации бывают разные, но токены JWT превратились в стандарт де-факто.
При аутентификации на основе токенов состояния не отслеживаются. Мы не будем хранить информацию о пользователе на сервере или в сессии и даже не будем хранить JWT, использованные для клиентов.
Процедура аутентификации на основе токенов:
Минусы
- различия в подходах к реализации у разных сервисов, порождающие необходимость написания отдельного кода под каждый новый сервис;
- если реализована интеграция с семейством приложений, работающих в одной экосистеме (например, Google), существует риск для всех интеграций при компрометации учетных данных либо сбое на стороне сервера API;
- OAuth 2.0 является новым и динамично развивающимся протоколом, в связи с чем возможны некоторые логические противоречия в его спецификации;
- основанная на SSL безопасность протокола может стать проблемой в высоконагруженных проектах.
Как обойтись без шифрования. хэширование
Фокус в том, что не нужно хранить пароли в открытом виде, но и не нужно шифровать их с возможностью расшифровки. Пароли нужно хэшировать и в базе хранить не пароль, а его хэш.
Хитрым образом закодированную строку, которую нельзя расшифровать. Например, не password, а 5f4dcc3b5aa765d61d8327deb882cf99
Вы можете спросить, что это за хрень и как же сравнить пароль, введенный пользователем, с паролем, лежащим в базе. А нам и не нужно сравнивать пароли – достаточно сравнить их хэши.
Например, есть простая функция хэширования md5. Вот так она работает
Приложение b. детали реализации для платформы
Этот документ в основном определяет передовые методы в общем виде, ссылаясь на методы, обычно доступные в различных средах. Этот ненормативный раздел документирует детали реализации передового опыта для различных операционных систем.
Детали реализации в данном документе считаются точными на момент публикации, но, вероятно, со временем изменятся. Следует надеяться, что такое изменение не сделает недействительными общие принципы, изложенные в остальной части документа, и что эти принципы должны иметь преимущественную силу в случае конфликта.
Cookies
Наверное вы часто слышали термин Cookies – это маленький фрагмент данных, которые система (сервер) хранит у пользователя. Каждый раз, когда пользователь открывает сайт – серверу отправляются данные Cookies, которые сервер сохранил у пользователя на устройстве.
Вы можете проектировать свои интерфейсы как с сохранением сессий пользователей, так и без сохранения.
Заглушка для авторизации
Функции, связанные с авторизацией, будут лежать в отдельном файле и своем пространстве имен. Создадим файл auth.php в api/v1/common – там, где уже лежит helpers.php.
Если вы разбирали уроки админки, особенно третий, про серверную часть, то эти пути вам будут знакомы. Если у вас свой проект, то кладите auth.php куда удобно.
Главное, потом правильно указать пути.
Содержимое auth.php
Обновление доступа
Как можно было видеть в предыдущих примерах, вместе с токеном при успешной авторизации возвращается также и ключ для обновления доступа (refresh_token). Он может использоваться для обновления токена по окончании его срока жизни, а также принудительного обновления во избежание компрометации токена при его передаче по открытым каналам. В случае успешного обновления доступа сервер API перевыпустит не только access, но и refresh_token.
В.5. детали реализации linux
Открытие запроса на авторизацию в браузере пользователя по умолчанию требует специальной команды: один из таких инструментов – «xdg-open».
Циклическое перенаправление является рекомендуемым вариантом перенаправления для настольных приложений в Linux, чтобы получить ответ авторизации. Приложениям НЕ СЛЕДУЕТ устанавливать параметры сокетов «SO_REUSEPORT» или «SO_REUSEADDR», чтобы другие приложения не связывались с этим сокетом.
Заключение
В данной статье мы рассмотрели базовые принципы работы аутентификации в различных системах. Вся эта статья нацелена для того, чтобы помочь дизайнерам интерфейсов понять то – как работает процесс аутентификации, для чего он нужен, каких видов он бывает и что происходит на большинстве этапов во время авторизации, регистрации, восстановления пароля пользователем.
Надеюсь вам было полезно, и хоть немного интересно.
Аннотация
Запросы на авторизацию OAuth 2.0 от собственных приложений следует отправлять только через внешних пользовательских агентов, в первую очередь через браузер пользователя. В данной спецификации подробно описываются причины безопасности и удобства использования, а также то, как собственные приложения и серверы авторизации могут реализовать эту передовую практику.
Начало
Сегодня я хотел бы рассказать о том, как проходит аутентификация в приложениях самых различных платформ – начиная от мобильных приложений, заканчивая консольными утилитами.
Аутентификация – это процесс, при котором пользователь подтверждает подлинность своей личности в какой-либо системе. Система предоставляет личные данные только своему владельцу.
Условные обозначения
Ключевые слова «ОБЯЗАН – MUST», «НЕ ОБЯЗАН – MUST NOT», «ТРЕБУЕТСЯ – REQUIRED», «ДОЛЖЕН – SHALL», «НЕ ДОЛЖЕН – SHALL NOT», «СЛЕДУЕТ – SHOULD», «НЕ СЛЕДУЕТ – SHOULD NOT», «РЕКОМЕНДУЕТСЯ – RECOMMENDED», «НЕ РЕКОМЕНДУЕТСЯ – NOT RECOMMENDED», «ВОЗМОЖЕН – MAY» и «ДОПОЛНИТЕЛЬНО – OPTIONAL» в этом документе интерпретироваться как описано в [RFC2119] [RFC8174].
B.1. детали реализации ios
Приложения могут инициировать запрос авторизации в браузере, не покидая приложение пользователем, через класс «SFSafariViewController» или его преемника «SFAuthenticationSession», которые реализуют шаблон вкладки браузера inapp. Safari может использоваться для обработки запросов на старых версиях iOS без функции вкладки браузера в приложении.
Двухфакторная аутентификация
В некоторых случаях может потребоваться дополнительная мера защиты учётных данных пользователя, и именно для этого вводится механизм двух факторной аутентификации – это когда пользователю необходимо подтвердить подлинность своей личности двумя разными способами. Примером может служить – ввод Email Пароль, а затем номера телефона и СМС кода.
Вместо заключения
Проблемы с dev режимом во vue – это неприятный момент. Мы хотим и апишечку подергать, и все удобства vue-cli использовать. И на елку влезть, и ничего не ободрать.
Возможно, есть более изящный способ обойти эти проблемы в dev режиме, но я их пока не нашел. Поэтому приходится подпирать код лишними условиями.
11. Внешние пользовательские агенты без браузера
В соответствии с этой передовой практикой рекомендуется использовать специальный тип внешнего пользовательского агента: браузер пользователя. Другие шаблоны внешних пользовательских агентов также могут быть полезны для безопасного и пригодного для использования OAuth. Этот документ не комментирует эти шаблоны.
Проверяем работоспособность vue
Вроде бы, чего там может сломаться? Нам же практически не пришлось лезть в код vue, за исключением добавления кнопки Выйти в шапке админки.
Но попробуем пересобрать админку, чтобы убедиться, что все хорошо. Сначала в production режиме
npm run build
Для кого эта статья
Статья для дизайнеров интерфейсов, которые желают понять то, как работают процессы регистрации, авторизации, восстановления пароля, применяемые в различных системах. Если вы разработчик/дизайнер, и нашли ошибку/неточность – то дайте мне знать (я с радостью доработаю статью).
Плюсы
- использование SSL для защиты данных,
- ограничение прав доступа стороннего приложения к пользовательским ресурсам областями видимости,
- обилие библиотек для реализации использования протокола во всех языках общего назначения.
3. Перенаправление интерфейса Loopback
Собственные приложения, которые могут открывать порт в петлевом сетевом интерфейсе без специальных разрешений (как правило, в настольных операционных системах), могут использовать петлевой интерфейс для получения перенаправления OAuth.
Процесс восстановления пароля
В случаях, когда пользователь забыл свой пароль – он может его восстановить при помощи системы восстановления доступа. Для этого пользователю нужно пройти несколько шагов.
Аутентификация или авторизация?
Некоторые путают термины «аутентификация» и «авторизация». Это разные вещи.
Ещё тут?
Поздравляю, вы успешно дочитали длинную, нудную и скучную статью.
Что делать дальше?
И вот мы подбираемся к самому интересному: а где хранить пароли и в каком виде? Давайте сначала подумаем, где их хранить.
Пример реализации протокола на php
Рассмотрим живой пример проекта клиент-серверного стороннего приложения, взаимодействующего по API с сервисом Google Таблицы.
Приложение a. контрольный список поддержки сервера
Серверы OAuth, которые поддерживают собственные приложения, должны:
Преимущества и недостатки oauth 2
Рассмотрим подробнее плюсы и минусы протокола авторизации.
Аутентификация в соцсетях
Уверен, эта картинка знакома всем: