Я думаю о веб-службе отдыха, которая гарантирует, что для каждого отправленного ему запроса:
- Запрос был сгенерирован пользователем, заявившим о нем;
- Запрос не был изменен кем-то другим (uri/method/content/date);
- Для запросов GET должна быть предусмотрена возможность создания URI с достаточным количеством информации для проверки подписи и установки даты истечения срока действия. Таким образом, пользователь может делегировать временные разрешения READ соавтору на ограниченный период времени для ресурса с помощью сгенерированного URI.
Клиенты аутентифицируются с помощью идентификатора и подписи содержимого на основе их пароля.
Сессии вообще не должно быть, поэтому состояние сервера! Сервер и клиент имеют общий секретный ключ (пароль)
Подумав об этом и поговорив с некоторыми действительно хорошими людьми, кажется, что не существует службы отдыха, которая могла бы сделать это так просто, как это должно быть для моего варианта использования. (HTTP Digest и OAuth могут делать это с состоянием сервера и очень болтливы)
Итак, я придумал один и прошу ваших замечательных комментариев о том, как он должен быть разработан (я выпущу его с открытым исходным кодом и надеюсь, что он может помочь другим).
Служба использует настраиваемый заголовок «Content-signature» для хранения учетных данных. Аутентифицированный запрос должен содержать этот заголовок:
Content-signature: <METHOD>-<USERID>-<SIGNATURE>
<METHOD> is the sign method used, in our case SRAS.
<USERID> stands for the user ID mentioned earlier.
<SIGNATURE> = SHA2(SHA2(<PASSWORD>):SHA2(<REQUEST_HASH>));
<REQUEST_HASH> = <HTTP_METHOD>\n
<HTTP_URI>\n
<REQUEST_DATE>\n
<BODY_CONTENT>;
Запрос считается недействительным через 10 минут после его создания.
Например, типичный HTTP-ЗАПРОС будет таким:
POST /ressource HTTP/1.1
Host: www.elphia.fr
Date: Sun, 06 Nov 1994 08:49:37 GMT
Content-signature: SRAS-62ABCD651FD52614BC42FD-760FA9826BC654BC42FD
{ test: "yes" }
Сервер ответит:
401 Unauthorized
OR
200 OK
Переменные будут:
<USERID> = 62ABCD651FD52614BC42FD
<REQUEST_HASH> = POST\n
/ressource\n
Sun, 06 Nov 1994 08:49:37 GMT\n
{ test: "yes" }\n
Параметры URI
Некоторые параметры могут быть добавлены в URI (они перегружают информацию заголовков):
- _sras.content-signature=‹METHOD>-‹USERID>-‹SIGNATURE>: УКАЖИТЕ учетные данные в URI, а не в заголовке HTTP. Это позволяет пользователю поделиться подписанным запросом;
- _sras.date=Sun, 06 Nov 1994 08:49:37 GMT (дата запроса*): Дата создания запроса.
- _sras.expires = Sun, 06 Nov 1994 08:49:37 GMT (дата истечения срока действия*): сообщить серверу, что срок действия запроса не должен истечь до указанной даты.
*формат даты: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
Спасибо за ваши комментарии.