Pull to refresh

Comments 19

Предвосхищая статью про собственную реализацию OAuth сервера — смотрели ли на готовые реализации типа Keycloak?
Мы написали свой сервис на основе IdentityServer4. Готовые реализации нам не подходили как минимум из-за того, что мы используем кастомный вариант Device flow. Нам требовалось сделать так, чтобы Device мог жить сам по себе без привязки к пользователю. Плюс мы используем уже существующие базы данных пользователей и кастомный RBAC для прозрачного перехода от одной версии сервиса к другой
Уже немного чуть более понятно. Недостаёт в каждом примере явного указания, кто есть кто. Но если дерзать, то можно понять.
С нетерпением жду рассказ про is4.
Спасибо за совет. Учту при написании следующей статьи
Флоу описывается OpenID Connect, который строится поверх OAuth2, который в свою очередь описывает детали реализации. OIDC также содержит дополнения к OAuth2, необходимые для реализации конкретных сценариев.
Если мы говорим об этой статье, то тут рассказывается только о OAuth 2.0. OpenID Connect 1.0 здесь не затрагивается совсем. OpenID Connect 1.0 приносит дополнительный Hybrid Flow (по сути немного изменённый Authorization Code flow), новый token с данными о авторизации клиента (ID Token) и, как вы правильно сказали, дополняет OAuth 2.0 уточнениями по реализации
Прошу прощения, ошибся. ID token содержит данные о аутентификации конечного пользователя

Вам не кажется, что свой велосипед был бы сильно проще в разработке, поддержке и использовании?

Уверен, что нет и вот почему:
  • Безопасность. Достаточно сложно придумать самостоятельно flow, который будет безопаснее, чем тот, который разрабатывает сообщество, в составе которых есть инженеры по безопасности топовых IT компаний. Кроме того, пользуясь стандартом вы можете залатывать дыры в соответствии с его обновлением раньше, чем пострадает бизнес (вряд ли вы найдёте не очевидную проблему в безопасности собственного протокола до взлома со стороны).
  • Поддержка. Для своего собственного протокола пришлось бы самостоятельно писать библиотеки. И хорошо, если вы и ваши партнёры пишете на одном языке. В противном случае, вам придётся поддерживать библиотеки на разных языках, что накладно. В случае со стандартом — уже существуют готовые библиотеки для популярных языков программирования. Кроме того, протокол будет развиваться, и документация по нему будет дорабатываться.
  • Лёгкость в интеграции. Недавно к нашему сервису авторизации подключился один из партнёров. Всё, что понадобилось от нас: настроить client_id, client_secret, выдать scope'ы и сказать, что нужно использовать OAuth 2.0 Authorization Code Flow + PKCE. Если бы у нас был свой протокол, то партнёру пришлось бы в нём разбираться и писать свою бибилиотеку для взаимодействия с кастомным решением, так как на его стороне разработка ведётся на языке, который вне нашего технического стека.
Расскажите тогда как с авторизацией и инвалидацией токенов дела обстоят? Полагаю в вашей системе у пользователя могут измениться права в любой момент, он может сделать logout или его могут заблокировать.
В веб-сервисах используется Authorization Code Flow with PKCE с выдачей access и refresh token’ов. Access token используется только для создания набора claim’ов для конкретного сервиса (т.е. получения сведений о пользователе, таких как id, email, телефон и т.д.), которые затем сохраняются в cookie и используются в процессе авторизации пользователя. Refresh token так же сохраняется в cookie, он необходим для проверки сессии (ведь токен могут отозвать) и обновления информации о пользователе. Соответственно все изменения состояния пользователя (редактирование или удаление/блокировка учётной записи) мы получаем в момент этого обновления. Интервал обновления с использованием refresh token’ов у каждого сервиса настраивается отдельно.
Непонятно как в такой схеме работают сразу несколько сервисов. Чтобы получить cookie нужно пройти авторизацию в identity, запросить claims, сохранить их в cookie и зашифровать ее уникальным для сервиса ключом. Получается юзер должен залогинится один раз для каждого сервиса — N сервисов, N процедур логина, N cookie в браузере. При этом каждая cookie рефрешится отдельно, поэтому когда refresh token истечет юзеру нужно будет опять делать N процедур логина.

Возможно у вас cookie может выдаваться identity сервером, тогда сервисы должны как-то уметь ее расшифровывать. Значит должна быть система распространения и отзыва ключей шифрования. Еще это значит, что каждый сервис должен уметь генерировать cookie если пришел запрос с истекшей cookie, в которой есть живой refresh token. Но вы говорите, что «Access token используется только для создания набора claim’ов для конкретного сервиса», значит ли это, что действительно у вас N cookie для N сервисов?

Да, на данный момент у нас N cookie для N сервисов.

Cookie не может выдаваться IdentityServer’ом, так как все сервисы находятся на разных доменах.

Важно понимать, что сервис, видя неавторизованного пользователя (рассматриваем сценарий, когда срок жизни cookie истёк), отправляет его на сервер авторизации, и если пользователь там уже аутентифицирован (на самом сервере авторизации), то он будет перенаправлен обратно на сервис в соответствии с Authorization Code Flow. Другими словами, если пользователь пришёл в сервис после окончания жизни cookie, то для него, в общем случае, весь процесс восстановления доступа будет выглядеть как пара редиректов.
спасибо за статью! Жду второй части. Действительно очень подробно и понятно написано

Это не совсем комментарий. Скорее вопрос по теме OIDC Auth для мобильных клиентов.
Пытаюсь выяснить для чего сервера OIDC просят android package + SHA при создании авторизации для приложения android. Ну и аналогично для iOS, Windows. В спеке не нашел, в гугле не нагуглил. На вопрос никто не ответил. Even on stack overflow. Я хотел начать смотреть код OSS OIDC сервера, но вы то уже, наверное, все посмотрели и можете легко сказать зачем же это все нужно и как это работает.

Я честно скажу, что не понимаю, что имеется ввиду под android package, но предполагаю, что под SHA имеется ввиду PKCE.
Если обратиться к RFC 8252, в котором как раз описывается работа с Native App, то мы увидим, что использование PKCE обязательно для таких приложений (ссылка на RFC, обратите внимание на третий абзац)

Под android package имеется ввиду не что иное, как android package - не знаю, как сказать по-другому. Под SHA имеется ввиду "Отпечаток сертификата для Android", как это называют в VK или "SHA-1 certificate fingerprint", как это называют в google или хэш-ключи Android, как это называют в facebook. SHA1 хэш ключа, которым вы подписываете свое приложение перед тем, как отправлять его в store.

Если вы захотите добавить "вход через VK" в свое android приложение, то для этого вам надо будет зайти на сайт vk для разработчиков, добавить там свое приложение и указать "Название пакета для Android", "Main activity для Android", "Отпечаток сертификата для Android". Вам предоставят ID приложения, "Защищённый ключ", "Сервисный ключ доступа". И это справедливо для любого типа нативного приложения (Windows, iOS) и для всех OIDC провайдеров (facebook, yandex, twitter, github и пр.) - то есть все провайдеры просят предоставить эту информацию. Ну и мне непонятно, как сервером используется информация "Название пакета для Android", "Main activity для Android", "Отпечаток сертификата для Android" в OIDC протоколе. Я постарался внимательно прочитать все RFC по OIDC, задал вопросы на Хабр Q&A, Stack overflow и никто не ответил, так что до сих пор непонятно.

В RFC 8252 (OAuth 2.0 for Native Apps) я вижу только предпочтительный flow для native apps и необходимость использовать PKCE.
RFC 7636 (PKCE - Proof Key for Code Exchange by OAuth Public Clients) добавляет верификацию вместо секретного ключа в OIDC flow - для того, чтобы перехват первоначального ответа не позволил злоумышленнику получить доступ.

Как используется android package и sha-1 certificate fingerprint непонятно. Исходные данные похожи на те, что используют в verified android app links.

Похоже самым простым способом ответить на этот вопрос будет взять исходники OSS OIDC Authorization Server и посмотреть.

Решил покопать в эту сторону, и поискать, зачем эта информация запрашивается. Вы были правы в вопросе на qna.habr.com. Запрос отпечатка никак не относится к OAuth 2.0. Это требуется для добавления Android App Links, и больше ни для чего. Ну а Package Name используется в качестве client id.

Могу с уверенностью сказать, то в OAuth 2.0 нет никакого упоминания fingerprint'ов для приложений. Более того, если вы попробуете добавить своё приложение в YandexID, к примеру, и выберите отличный тип приложения от Android'а - требования к fingerprint не будет, хотя процесс аутентификации всё равно будет работать через OAuth 2.0.

Ну и по данному вопросу я писал в техподдержку Yandex, где мне подтвердили мои предположения.

Спасибо за статью! Есть уточнения по терминам на схеме - см. картинку., точно ли там не user code должен быть?

И в тексте в статье ниже: Verification URI и Redirection URI  - это же про одно?

Sign up to leave a comment.