Глобальная авторизация в веб-системах — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
м
м
Строка 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>&nbsp;&rarr;
 
|valign=top| <tt style="background-color: #e0ffe0">C1</tt>&nbsp;&rarr;
 
|valign=top| (делает GET-запрос напрямую)&nbsp;&rarr;
 
|valign=top| (делает GET-запрос напрямую)&nbsp;&rarr;
Строка 27: Строка 27:
 
&rArr; <tt style="background-color: #e0e0ff">С2</tt> запоминает соответствие ID и KEY.
 
&rArr; <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>&nbsp;&rarr;
 
|valign=top| <tt style="background-color: #e0ffe0">С1</tt>&nbsp;&rarr;
 
|valign=top| (перенаправление браузера пользователя)&nbsp;&rarr;
 
|valign=top| (перенаправление браузера пользователя)&nbsp;&rarr;
Строка 37: Строка 37:
 
&rArr; <tt style="background-color: #e0e0ff">С2</tt> даётся возможность прочитать cookie пользователя и получить данные о нём.
 
&rArr; <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>&nbsp;&rarr;
 
|valign=top| <tt style="background-color: #e0e0ff">С2</tt>&nbsp;&rarr;
 
|valign=top| (делает POST-запрос напрямую)&nbsp;&rarr;
 
|valign=top| (делает POST-запрос напрямую)&nbsp;&rarr;
Строка 48: Строка 48:
 
&rArr; <tt style="background-color: #e0ffe0">С1</tt> запоминает соответствие ID и переданных данных.
 
&rArr; <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>&nbsp;&rarr;
 
|valign=top| <tt style="background-color: #e0e0ff">С2</tt>&nbsp;&rarr;
 
|valign=top| (перенаправление браузера пользователя)&nbsp;&rarr;
 
|valign=top| (перенаправление браузера пользователя)&nbsp;&rarr;

Версия 17:46, 13 июля 2010

…или как реализовать простой Single Sign-on в веб-системах.

Ниже описан простейший протокол, который даёт возможность нам сказать внешней системе, кто к нам вошёл, так, что внешняя система знает, что это говорим ей именно мы, а мы знаем, что мы говорим это именно ей.

  • (П) Пользователь.
  • (С1) Система 1 — клиент глобальной авторизации. В неё пришёл пользователь без авторизации.
  • (С2) Система 2 — сервер глобальной авторизации. В ней пользователь уже авторизован, скорее всего, через cookie.
шаг кто что делает кому
(П) → (переходит по ссылке) → C1 с любыми параметрами.

C1 хочет перенять авторизацию у С2.
C1 генерирует случайный ID (ID) и ключ (KEY). Никаких ограничений на эти значения не накладывается, кроме того, что они должны быть достаточно стойки к подбору и, желательно, состоять из печатных символов. Например, за каждый из них можно взять 16 случайных байт, взятых из /dev/urandom в UNIX-системах и GetRandom() в Windows.

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
  • URL — URL для возврата на С1, на который С2 будет передавать данные и на который же С2 будет отправлять пользователя редиректом обратно.
  • Если CHECK=0 или не передаётся, и пользователь не авторизован в С2, она должна потребовать от него авторизоваться.

С2 даётся возможность прочитать cookie пользователя и получить данные о нём.

align=center| 3 С2 → (делает POST-запрос напрямую) → С1 с параметрами ga_client=1&ga_id=ID&ga_key=KEY&ga_data=DATA&ga_nologin=NOLOGIN
  • DATA — данные о вошедшем пользователе в произвольном формате, кодированные в JSON.
  • NOLOGIN=1 и DATA="" (пустой строке), если и только если CHECK=1 и пользователь не авторизован в С2.
  • Иначе NOLOGIN не передаётся или NOLOGIN=0.

С1 запоминает соответствие ID и переданных данных.

align=center| 4 С2 → (перенаправление браузера пользователя) → С1 с параметрами ga_client=1&ga_id=ID&ga_res=CODE
  • CODE — HTTP-код статуса, полученный от POST-запроса из предыдущего пункта.

С1 может взять сохранённые в предыдущем пункте данные и на их основе авторизовать пользователя.

И ID и ключ являются секретными, но ID знают и сервера, и пользователь (ID передаётся в браузер), а ключ — только сами сервера. За счёт этого достигается безопасность: пользователь не может сам передать произвольные данные авторизации на сервер, не зная ключа.

Для дополнительной защиты всё это можно просто пустить через HTTPS (SSL).