Глобальная авторизация в веб-системах — различия между версиями
м |
м |
||
Строка 21: | Строка 21: | ||
<tt style="background-color: #e0ffe0">C1</tt> генерирует случайный ID (ID) и ключ (KEY). Никаких ограничений на эти значения не накладывается, кроме того, что они должны быть достаточно стойки к подбору и, желательно, состоять из печатных символов. Например, за каждый из них можно взять 16 случайных байт, взятых из <tt>/dev/urandom</tt> в UNIX-системах и <tt>GetRandom()</tt> в Windows. | <tt style="background-color: #e0ffe0">C1</tt> генерирует случайный ID (ID) и ключ (KEY). Никаких ограничений на эти значения не накладывается, кроме того, что они должны быть достаточно стойки к подбору и, желательно, состоять из печатных символов. Например, за каждый из них можно взять 16 случайных байт, взятых из <tt>/dev/urandom</tt> в UNIX-системах и <tt>GetRandom()</tt> в Windows. | ||
|- | |- | ||
− | |valign=top| 1 | + | |valign=top|align=center| 1 |
|valign=top| <tt style="background-color: #e0ffe0">C1</tt> → | |valign=top| <tt style="background-color: #e0ffe0">C1</tt> → | ||
|valign=top| (делает GET-запрос напрямую) → | |valign=top| (делает GET-запрос напрямую) → | ||
Строка 27: | Строка 27: | ||
⇒ <tt style="background-color: #e0e0ff">С2</tt> запоминает соответствие ID и KEY. | ⇒ <tt style="background-color: #e0e0ff">С2</tt> запоминает соответствие ID и KEY. | ||
|- | |- | ||
− | |valign=top| 2 | + | |valign=top|align=center| 2 |
|valign=top| <tt style="background-color: #e0ffe0">С1</tt> → | |valign=top| <tt style="background-color: #e0ffe0">С1</tt> → | ||
|valign=top| (перенаправление браузера пользователя) → | |valign=top| (перенаправление браузера пользователя) → | ||
Строка 37: | Строка 37: | ||
⇒ <tt style="background-color: #e0e0ff">С2</tt> даётся возможность прочитать cookie пользователя и получить данные о нём. | ⇒ <tt style="background-color: #e0e0ff">С2</tt> даётся возможность прочитать cookie пользователя и получить данные о нём. | ||
|- | |- | ||
− | |valign=top| 3 | + | |valign=top|align=center| 3 |
|valign=top| <tt style="background-color: #e0e0ff">С2</tt> → | |valign=top| <tt style="background-color: #e0e0ff">С2</tt> → | ||
|valign=top| (делает POST-запрос напрямую) → | |valign=top| (делает POST-запрос напрямую) → | ||
Строка 48: | Строка 48: | ||
⇒ <tt style="background-color: #e0ffe0">С1</tt> запоминает соответствие ID и переданных данных. | ⇒ <tt style="background-color: #e0ffe0">С1</tt> запоминает соответствие ID и переданных данных. | ||
|- | |- | ||
− | |valign=top| 4 | + | |valign=top|align=center| 4 |
|valign=top| <tt style="background-color: #e0e0ff">С2</tt> → | |valign=top| <tt style="background-color: #e0e0ff">С2</tt> → | ||
|valign=top| (перенаправление браузера пользователя) → | |valign=top| (перенаправление браузера пользователя) → |
Версия 17:46, 13 июля 2010
…или как реализовать простой Single Sign-on в веб-системах.
Ниже описан простейший протокол, который даёт возможность нам сказать внешней системе, кто к нам вошёл, так, что внешняя система знает, что это говорим ей именно мы, а мы знаем, что мы говорим это именно ей.
- (П) Пользователь.
- (С1) Система 1 — клиент глобальной авторизации. В неё пришёл пользователь без авторизации.
- (С2) Система 2 — сервер глобальной авторизации. В ней пользователь уже авторизован, скорее всего, через cookie.
шаг | кто | что делает | кому |
---|---|---|---|
(П) → | (переходит по ссылке) → | C1 с любыми параметрами. ⇒ C1 хочет перенять авторизацию у С2. | |
align=center| 1 | C1 → | (делает GET-запрос напрямую) → | С2 с параметрами ga_id=ID&ga_key=KEY ⇒ С2 запоминает соответствие ID и KEY. |
align=center| 2 | С1 → | (перенаправление браузера пользователя) → | С2 с параметрами ga_id=ID&ga_url=URL&ga_check=CHECK
⇒ С2 даётся возможность прочитать cookie пользователя и получить данные о нём. |
align=center| 3 | С2 → | (делает POST-запрос напрямую) → | С1 с параметрами ga_client=1&ga_id=ID&ga_key=KEY&ga_data=DATA&ga_nologin=NOLOGIN
⇒ С1 запоминает соответствие ID и переданных данных. |
align=center| 4 | С2 → | (перенаправление браузера пользователя) → | С1 с параметрами ga_client=1&ga_id=ID&ga_res=CODE
⇒ С1 может взять сохранённые в предыдущем пункте данные и на их основе авторизовать пользователя. |
И ID и ключ являются секретными, но ID знают и сервера, и пользователь (ID передаётся в браузер), а ключ — только сами сервера. За счёт этого достигается безопасность: пользователь не может сам передать произвольные данные авторизации на сервер, не зная ключа.
Для дополнительной защиты всё это можно просто пустить через HTTPS (SSL).