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

Материал из YourcmcWiki
Перейти к: навигация, поиск
м
м
Строка 14: Строка 14:
 
! кому
 
! кому
 
|-
 
|-
|  
+
|
 
|valign=top| (П) →
 
|valign=top| (П) →
 
|valign=top| (переходит по ссылке) →
 
|valign=top| (переходит по ссылке) →
Строка 58: Строка 58:
 
|}
 
|}
  
И ID и ключ являются секретными, но ID знают и сервера, и пользователь (ID передаётся в браузер), а ключ — только сами сервера. За счёт этого достигается безопасность: пользователь не может сам передать произвольные данные авторизации на сервер, не зная ключа.
+
И ID и ключ являются «секретными», но ID знают и сервера, и пользователь (ID передаётся в браузер), а ключ — только сами сервера. За счёт этого достигается безопасность: пользователь не может сам передать произвольные данные авторизации на сервер, не зная ключа.
  
 
Для дополнительной защиты всё это можно просто пустить через HTTPS (SSL).
 
Для дополнительной защиты всё это можно просто пустить через HTTPS (SSL).
  
 
[[Категория:Разработка]]
 
[[Категория:Разработка]]

Версия 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.

1 C1 → (делает GET-запрос напрямую) → С2 с параметрами ga_id=ID&ga_key=KEY

С2 запоминает соответствие ID и KEY.

2 С1 → (перенаправление браузера пользователя) → С2 с параметрами ga_id=ID&ga_url=URL&ga_check=CHECK
  • URL — URL для возврата на С1, на который С2 будет передавать данные и на который же С2 будет отправлять пользователя редиректом обратно.
  • Если CHECK=0 или не передаётся, и пользователь не авторизован в С2, она должна потребовать от него авторизоваться.

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

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 и переданных данных.

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

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

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

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