1. 出品者なら値下げできる
  2. 他人は403。ログインし直しても通らない
  3. 未ログインは401
  4. 無い商品は404
  5. 未ログインなら商品の有無より先に401
コース一覧
Express道場 fleama開発室のIssue10件
#108 他人の出品を値下げできてしまう

Express道場 fleama開発室のIssue10件

Node.js入門で作り上げた fleama API の開発室に、スプリントの助っ人として参加する演習専用コースです。解説はありません。1問が1件の Issue で、報告者は商店街の住人たち。依頼と完成条件だけを読み、白紙から自分で組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。ヘルスチェックから始まり、一覧API、404の扱い、並び替えとページング、入力検証、自作ミドルウェア、エラー形式の統一、所有者チェック、二重販売を止めるトランザクションを経て、最後はいいね機能をエンドポイント設計から任されるところまで、10件の Issue で Express の主要な道具を一巡します。1問15分から45分、全10問で約5時間です。Node.js入門を終えて「作れたけれど実務で通用するか不安」と感じている方に向いています。

1
今週のスプリント
01. #101 監視用ヘルスチェックが欲しい15分
02. #102 カテゴリ一覧APIが欲しい20分
03. #103 消えた商品を開くと落ちる20分
04. #104 検索に並び替えとページングを25分
05. #105 0円出品が通ってしまう25分
06. #106 調査用のアクセスログを25分
07. #107 エラーの形式がバラバラ30分
08. #108 他人の出品を値下げできてしまう30分
09. #109 同じ商品が2人に売れた35分
10. #110 新機能「いいね」を設計から45分

#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":新しい価格} を返してください。

要件

  1. トークンは (req.headers.authorization || "").replace("Bearer ", "") で取り出す
  2. 401 → 404 → 403 の順で確かめ、それぞれ next(err) で投げる
  3. 通れば商品の 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":"ログインしてください"}"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

初期コードは誰でも通してしまいます。3つの確認を、値下げの前に足します

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • #109 同じ商品が2人に売れた

    確認と更新の隙間をトランザクションで塞ぎ、二重販売を止めます。

  • #110 新機能「いいね」を設計から

    付ける・外す・件数取得の3エンドポイントを、設計から任されます。

  • #107 エラーの形式がバラバラ

    バラバラだったエラー応答を、共通ハンドラで1つの形に統一します。

  • #106 調査用のアクセスログを

    全リクエストのメソッドとパスを記録するミドルウェアを自作します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 認証「この人は本当に本人?」のチェック
  • 認可「この人はこの操作していい人?」のチェック
  • 判断YES/NO 分岐を表す菱形
  • トークンLLM が扱う最小の文字単位
main.js
学習モード
エディタを読み込んでいます

メモ

#108 他人の出品を値下げできてしまう

⌘S で保存