私は彼に送信されるすべてのリクエストに対して次のことを保証するRESTWebサービスを考えています:
- リクエストは、それを主張するユーザーによって生成されました;
- リクエストは他の誰かによって変更されていません(uri / method / content / date);
- GETリクエストの場合、署名を確認して有効期限を設定するのに十分な情報を含むURIを生成できる必要があります。このようにして、ユーザーは、生成されたURIを使用して、リソース上の限られた期間、一時的なREAD権限を共同編集者に委任できます。
クライアントは、パスワードに基づいてIDとコンテンツ署名で認証されます。
セッションはまったく存在しないはずなので、サーバーの状態です。サーバーとクライアントは秘密鍵(パスワード)を共有します
それについて考え、本当に素晴らしい人々と話をした後、私のユースケースのように単純なことを行うためのRESTサービスは存在しないようです。(HTTPダイジェストとOAuthはサーバーの状態でこれを行うことができ、非常におしゃべりです)
それで私は1つを想像しました、そして私はそれがどのように設計されるべきかについてあなたの偉大なコメントを求めています(私はそれをOpenSourceにリリースし、それが他の人を助けることができることを願っています)。
このサービスは、カスタムの「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 = <METHOD>-<USERID>-<SIGNATURE>:HTTPヘッダーではなく、URIにクレデンシャルを配置します。これにより、ユーザーは署名されたリクエストを共有できます。
- _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
コメントしてくれてありがとう。