APIセキュリティ入門:REST・認証・認可
オブジェクト単位の認可
この回でやること
APIは1件1件のデータをそのままJSONで返します。認証を通しただけでは、そのデータの持ち主かどうかは何も分かりません。オブジェクト単位の認可がなぜ必要かを扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
オブジェクト単位の認可は、APIが返す1件1件のデータについて、この人が触ってよいかを確かめる判定です。この回は、画面の無いAPIでその判定が抜けるとどう見えるかを扱います。
読み終えるころには、自分の番号と他人の番号を送り分け、返るJSONのowner欄を並べて読む点検ができるようになります。
APIでは、オブジェクトがそのまま返る
GET /api/orders/1043は、注文1043というオブジェクトをそのままJSONで返します。画面のあるアプリなら、tanakaのマイページにはtanakaの注文しか並ばず、他人の注文の存在に触れる導線がそもそもありませんでした。APIにはその画面がありません。URLの番号を差し替えれば、サーバーは直接そのオブジェクトを引きにいきます。
http
GET /api/orders/1044
Authorization: Bearer <tanaka のトークン>
200 OK
{"order_id":"1044","owner":"sato","total_yen":98000}tanakaのトークンは正しく通っています。それでもsatoの注文が返っています。
認証は「誰か」、認可は「触ってよいか」
トークンが通ったことは、送り主がtanakaだと分かった、というだけです。注文1044がtanakaのものかどうかは、トークンのどこにも書いてありません。オブジェクト単位の認可とは、引いてきた1件について、そのowner欄とログイン中の利用者が一致するかを、サーバーが毎回確かめることです。
トークンは本人性を表し、所有はデータ側にある事実です。認証を通したことで所有まで確かめたことにはなりません。この2つを1つに混ぜると、ログインさえ通れば全件読める作りになります。
手を動かして確かめる
練習用の環境で、自分のtanakaでGET /api/orders/1043を送り、返るJSONのowner欄が自分かを見ます。次に番号を1044に変えて同じトークンで送ります。ownerがsatoなのに200で中身が返るなら、このエンドポイントはオブジェクト単位の認可が抜けています。
直す向きは、引いた行のownerとトークンの利用者を突き合わせ、一致しなければ返さないことです。番号で引くだけでなく所有関係で引く具体は、この章の後半で組み立てます。確かめるのは自分が権限を持つ練習用の環境だけにします。