REST API を設計する場合、最初にユーザーを認証するのが一般的ですか?
私が探している典型的な使用例は次のとおりです。
- ユーザーはデータを取得したいと考えています。共有するのは素晴らしいことです! 公開 API キーを取得して、読み取ってください!
- ユーザーがデータを保存/更新したいのですが... ちょっと待ってください! あなたは誰ですか、これができますか?
一度ビルドして、Web アプリ、Android アプリケーション、または iPhone アプリケーションで使用できるようにしたいと考えています。
REST APIは次のような要件を満たす論理的な選択肢であるように思われる。
私の質問を説明するために、簡単な例を挙げます。
データベースにアイテムがあり、評価属性(整数1~5)。
REST を正しく理解していれば、次のように csv、xml、または json を返す任意の言語を使用して GET リクエストを実装します。
http://example.com/product/getrating/{id}/
JSON を選択すると、次の結果が返されます。
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
これは、公開 API の場合は問題ありません。その部分は理解しています。
たくさんの疑問があるのは、これをセキュリティ モデルとどのように組み合わせるかということです。私は、ユーザーを常に識別するセッション状態があり、ユーザーが何を送信するかに関係なく、ユーザーが実行できることを制御できる Web アプリ セキュリティに慣れています。私の理解では、これは RESTful ではないため、この場合は適切なソリューションではありません。
同じアイテム/評価を使用して別の例を使用してみます。
ユーザー「JOE」が評価にアイテム
これは以下を使用して実行できます。
http://example.com/product/addrating/{id}/{givenRating}/
この時点で、「JOE」が製品 {id} に {givenRating} の評価を与えたというデータを保存したいと思います。
質問: リクエストが「BOB」ではなく「JOE」から送信されたことをどうやって確認すればよいですか。
さらに、ユーザーの電話番号のようなより機密性の高いデータの場合はどうなるでしょうか?
これまでに得たものは次のとおりです。
1) HTTP の組み込み機能を使用して、プレーン HTTP または HTTPS のいずれかのリクエストごとに認証します。
つまり、すべてのリクエストは次の形式になります。
https://joe:[email protected]/product/addrating/{id}/{givenRating}/
2) 秘密鍵と公開鍵を使用した Amazon の S3 のようなアプローチを使用します。http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3) とにかく Cookie を使用し、REST のステートレス部分を破壊します。
2 番目のアプローチの方が私には良さそうに思えますが、ハッシュ化、保存、キーの生成などをすべて自分でやり直さなければならないのだろうかと疑問に思います。
これは、典型的な Web アプリケーションでセッションを使用し、スタック全体を自分で書き直すことによく似ています。これは通常、特にセキュリティを扱う場合、「やり方が間違っている」という意味になります。
編集: OAuth についても言及すべきだったと思います。
ベストアンサー1
5年後の編集
OAuth2を使用してください。
前のバージョン
いいえ、Cookie を使用する必要はまったくありません。HTTP Digest、OAuth、Amazon の AWS (コピーするのはそれほど難しくありません) の半分も安全ではありません。
Cookie は、Basic/Digest/OAuth などと同様に認証トークンであるものの、それほど適切ではないと考える必要があります。
しかし、クッキーの使用はRESTfulの原則に反するとは思いません。それ自体ただし、セッション クッキーの内容が、サーバーから返されるリソースの内容に影響を与えない限りは、問題ありません。
クッキーは悪です。使用をやめましょう。