Индивеб-календарь: Логин

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

Затем появился OAuth 2 (я нарочно опускаю всю историю с OpenID), и некоторые крупные сайты стали предоставлять возможность «войти через Икс»: такое есть у Твиттера, Фейсбука, ВКонтакте, Гитхаба.

Тонкий момент заключается в том, что в этом случае доступ к сервису, в котором я зарегистрировался через кнопку «Sign-in with Github», зависит от моего аккаунта на Гитхабе — если мой аккаунт заблокируют, потому что окажется, что я из неугодной страны, то я потеряю доступ ко всем прочим сайтам. Но если получится вставить между сайтом и Гитхабом ещё один слой, который контролирую я, то получится обойти эту ситуацию.

На этом построены web-sign-in и IndieAuth. Выглядит это так: на своём сайте я добавляю ссылки на свои аккаунты на Гитхабе, Твиттере, Фейсбуке, и добавляю им атрибут rel="me".

Если аккаунты по ссылке ссылаются обратно на мой сайт, то можно с большой долей уверенностью считать, что так получилось не случайно, и я контролирую и сайт, и аккаунт. После этого я могу логиниться на сайты, поддерживающие IndieAuth, используя свой домен. На примере абстрактного сайта example.org это выглядит так:

  1. я вбиваю https://marinintim.com в качестве своего логина
  2. example.org редиректит меня на IndieLogin (сервис, упрощающий интеграцию)
  3. IndieLogin смотрит, какие ссылки есть на моём сайте с атрибутом rel="me" из провайдеров, с которыми он умеет работать
  4. IndieLogin предлагает мне выбрать, через какого провайдера я хочу подтвердить, что это я
  5. IndieLogin начинает OAuth с выбранным провайдером
    6.Когда всё успешно, то меня перебрасывает на example.org, и я залогинен.

Ключевой момент здесь в том, что example.org получает в конце только https://marinintim.com, и не знает, через какой сервис я это подтвердил: я смогу в следующий раз выбрать не Гитхаб, а Твиттер, или вообще заменить ссылку на своём сайте на другой профиль.

По сути, IndieAuth — это протокол, основанный на OAuth 2.0, в котором указано, что идентификатор пользователя — это URL, который можно открыть в браузере (не вдаваясь в детали: OAuth 2.0 это не протокол, а скорее конструктор, из которого можно собрать протокол, поэтому у всех немного разные реализации).

Чтобы начать использовать это всё как пользователь, достаточно закинуть на свой сайт ссылки на свои аккаунты. Сделать на своём сервисе поддержку IndieAuth несколько сложнее (как обычно с OAuth), поэтому появился IndieLogin, который сильно упрощает поддержку протокола.

И чтобы проверить, что у тебя получилось, можно зайти на сайт pin13.net или завести аккаунт на вики Индивеба.

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