RESTful Web サービスに関する多くの例では、今日の多くのアプリケーションがマルチユーザーであるという問題が考慮されていません。
RESTful API を公開するマルチユーザー バックエンドを想像してみてください。バックエンド データ アーキテクチャは、共有データベースと共有スキーマを使用します。各テーブルには次への参照が含まれますtenant_id
。
+-------------+----+-----------------+
| tenant_name| id | shared_secret |
+-------------+----+-----------------+
| bob | 1 | 2737sm45sx543 |
+-------------+----+-----------------+
| alice | 2 | 2190sl39sa8da |
+-------------+----+-----------------+
+-------------+----+-------+-----------+
| pet_name | id | type | tenant_id |
+-------------+----+-------+-----------+
| fuffy | 1 | dog | 1 |
+-------------+----+-------+-----------+
| kerry | 2 | cat | 2 |
+-------------+----+-------+-----------+
質問 1 : 3 つ以上のクライアント アプリケーション (つまり、Android、iOS、Web アプリ) が RESTful バックエンドと対話する場合、バックエンドに対してどのように認証を実行しますか?
RESTful backend, API, HTTP-Verbs, shared database and schema
|
|
+---- Web Application (Client 1)
| |
| + Alice
| |
| + Bob
|
+---- Android Application (Client 2)
| |
| + Alice
| |
| + Bob
|
+---- iOS Application (Client 3)
| |
| + Alice
| |
| + Bob
|
各クライアントは、アリスとボブが自分のペットを管理できるようにする必要があります。各クライアントは GUI であり、バックエンドを (内部的に、HTTP 要求を作成して) 使用します。質問: 各クライアントはどのようにバックエンドに対して認証できますか?
HMAC を想定します (完全に RESTful であり、セッションはありません): この方法では、ペイロードに共有秘密鍵で署名する必要があります (ネットワーク経由で送信されることはありません)。各クライアントは、(フィールドtenant
を保持する) テーブルの独自のコピーを持つ必要がありますか?shared_secret
Android App -> Client Sign -> Signed Request -> Backend -> Result
Web App -> Client Sign -> Signed Request -> Backend -> Result
質問 2 : リソース URI はどのように表示されますか?
ボブのペットを入手するには、次の 2 つの方法があります。
可能性 #1:Authorization
ヘッダーは、テナントの (一意の) 名前を提供します。
GET /pets HTTP/1.1
Host: www.example.org
Authorization: bob:c29kYW9kYSBhb2lzYWRoIGYgZDUzNDUz
可能性その2。はtenant_id
クエリ パラメータとして送信されます。
GET /pets/tenant_id=1 HTTP/1.1
Host: www.example.org
Authorization: bob:c29kYW9kYSBhb2lzYWRoIGYgZDUzNDUz