Подпись HTTP-запроса без сеанса

Я думаю о веб-сервисе для отдыха, который гарантирует для каждого отправленного ему запроса, что:

  • Запрос был сгенерирован пользователем, заявившим его;
  • Запрос не был изменен кем-то другим (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

ИЛИ

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 = - - : ВСТАВЬТЕ учетные данные в URI, а не в заголовок HTTP. Это позволяет пользователю поделиться подписанным запросом;
  • _sras.date = Sun, 06 Nov 1994 08:49:37 GMT (дата запроса *): дата создания запроса.
  • _sras.expires = Вс, 6 ноября 1994 г. 08:49:37 GMT (дата истечения срока действия *): Сообщите серверу, что срок действия запроса не должен истекать раньше указанной даты

* формат даты: http: // www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18

Благодарим за комментарии.

5
задан Sébastien VINCENT 22 December 2010 в 20:18
поделиться