По какому принципу реализована единая аутентификация для нескольких приложений таких как Google Apps или Microsoft Office?

С превеликим удовольствием прочитал ответ-лекцию на вопрос Что именно идентифицирует посетителя сайта?. По пути, эта лекция отвечает на вопрос: "Какие стратегии аутентификации/авторизации наиболее популярные?" с примерным описанием алгоритмов. Ну а в этом вопросе я бы хотел рассмотреть более сложный случай - единая аутентификация на несколько приложений.

Допустим, мы разрабатываем аналог Google Apps или Microsoft Office. Наши приложения наподобие Microsoft Word (допустим, N-Docs) или Google Spreadsheets (скажем, N-Spreadsheets) можно скачать в виде нативных приложений или пользоваться урезанными веб-версиями. Поскольку эти приложения от одного производителя, то можно организовать единый центр аутентификации/авторизации.

Вопрос такой: какая стратегия аутентификации подойдёт, чтобы авторизация в одном приложении автоматически выполняла авторизацию во всех приложениях от этого же производителя?

Однозначно можно сказать, что такие возможно, потому что Google это как-то удалось (в случае веб-приложений точно, и, с большой вероятностью, в случае с нативными Andorid-приложениями). Но какая стратегия аутентификации тут используется?

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

Ответы (1 шт):

Автор решения: Talleyran

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

В вебе, если у вас все продукты находятся на поддоменах, то им можно писать одну глобальную куку, которую всем будет видно по маске типа *.mysite.com. Так же есть уже упомянутая в комментариях технология Single Sign On (SSO) вики и на хабре. Кратко смысл там в том, что есть один сервер аутентификации, которому доверяют все остальные ваши приложения посредством сертификатов.

В любой ОС есть масса вариантов, куда это можно положить: как минимум директория пользователя. Ее могут читать и писать любые приложения запущенные от его имени как в windows так и в linux.

В частности в Windows есть папка appdata, которую могут читать все на свете. То же самое с веткой реестра HKEY_CURRENT_USER\Software\

В Linux общепринятой практикой является хранить данные по пути ~/.config/program_name а в MacOS вроде как в users\shared но насчет последнего не совсем уверен.

В обобщенном виде создаете там каталоги \vendor_name\program_name1, \vendor_name\program_name2 и т.д. и храните любые данные которые хотите шарить между приложениями в \vendor_name\. Само собой там не стоит хранить чувствительные данные в открытом виде, а только в зашифрованном, чтобы только ваши приложения смогли ими воспользоваться.

В андроиде есть специальные инструменты AccountManager и Keychain для хранения учетных записей и сертификатов. В iOS и macOS так же есть Keychain.

→ Ссылка