#108 他人の出品を値下げできてしまう
中段 / 目安 30分
Issue #108 他人の出品を値下げできてしまう
報告者: 陽葵(カフェ店長)
「ちょっと。私のカップ、知らない間に半額になってたんだけど。誰でも値下げできるのおかしくない」
おかしいです。いまの PATCH /items/:id/price は、誰が呼んでも通ります。
必要なのは2段階の確認です。ここで認証と認可の違いがはっきりします。
| 問い | 足りないと | |
|---|---|---|
| 認証 | あなたは誰か | 401 |
| 認可 | それをしてよいか | 403 |
401 は「誰だか分からない」です。ログインすれば通ります。
403 は「誰かは分かるが、権限が無い」です。ログインし直しても通りません。 他人の商品は、誰としてログインしても他人の商品だからです。
この違いは受け取る側に効きます。401 ならログイン画面へ送ればよく、403 なら送っても無駄だと分かります。取り違えると、いつまでもログイン画面をさまようことになります。
確かめる順番も決まっています。
プレーンテキスト
1. ログインしているか → 401
2. その商品はあるか → 404
3. 自分の出品か → 403誰だか分からないうちは権限も判断できませんし、存在しない商品に権限の話はできません。
この演習では、トークンがそのまま利用者の名前です。Authorization ヘッダーの Bearer の後ろに入っています。
完成条件
PATCH /items/:id/price に、認証と認可を足してください。
エラーは前の Issue で作った共通ハンドラに next(err) で投げます。成功したときは {"id":1,"price":新しい価格} を返してください。
要件
- トークンは
(req.headers.authorization || "").replace("Bearer ", "")で取り出す - 401 → 404 → 403 の順で確かめ、それぞれ
next(err)で投げる - 通れば商品の
priceを書き換え、{id, price}を返す
入出力例
request("PATCH", "/items/1/price", {"price":1500}, "hinata") → "200 {"id":1,"price":1500}"
request("PATCH", "/items/1/price", {"price":1000}, "matsuda") → "403 {"error":"この商品は編集できません"}"
request("PATCH", "/items/1/price", {"price":1000}) → "401 {"error":"ログインしてください"}"
request("PATCH", "/items/999/price", {"price":1000}, "hinata") → "404 {"error":"商品が見つかりません"}"
request("PATCH", "/items/999/price", {"price":1000}) → "401 {"error":"ログインしてください"}"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部