1. 自分の商品は編集できる
  2. 他人の商品は編集できない
  3. 無い商品は404
  4. ログインしていなければ401
  5. 自分の商品は削除できる
  6. 他人の商品は削除できない
コース一覧
Node.js入門
本人のものだけ

Node.js入門

Node.jsの実行モデル、npm、Expressによるルーティング、REST API設計、データベース接続、トランザクションを使った購入処理、トークン認証まで、バックエンド開発の基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIを自分の手で作りながら学びます。

1
Node.jsとは
01. Node.jsとは15分
02. スクリプトを実行する15分
03. npmとは15分
04. package.json15分
05. npmスクリプト15分
06. つくる:プロジェクト始動20分
07. 第1章クイズ10分
2
モジュールと非同期の復習
01. import/export15分
02. ファイルを読み書きする15分
03. async/await復習15分
04. JSONの取り回し15分
05. つくる:データ層20分
06. 第2章クイズ10分
3
はじめてのサーバー
01. サーバーとリクエスト15分
02. Expressを導入する15分
03. ルーティング15分
04. JSONを返す15分
05. 開発の回し方15分
06. つくる:サーバー始動20分
07. 第3章クイズ10分
4
REST APIのきほん
01. RESTの考え方15分
02. 一覧を返す15分
03. 1件を返す15分
04. 登録を受ける15分
05. 更新と削除15分
06. ステータスコード15分
07. つくる:商品CRUD完成20分
08. 第4章クイズ10分
5
リクエスト処理と検証
01. クエリパラメータ15分
02. 並び替えとページング15分
03. 入力検証15分
04. ミドルウェア15分
05. エラーハンドリング15分
06. つくる:検索API完成20分
07. 第5章クイズ10分
6
データベース接続
01. DBにつなぐ15分
02. 一覧・詳細をDB化15分
03. 出品をDB化15分
04. SQLインジェクション20分
05. 更新・削除をDB化15分
06. 購入トランザクション20分
07. つくる:DB版fleama20分
08. 第6章クイズ10分
7
認証のきほん
01. 認証と認可15分
02. パスワードハッシュ15分
03. ログインとトークン15分
04. 保護ルート15分
05. 本人のものだけ15分
06. つくる:認証完備20分
07. 第7章クイズ10分
8
総合制作
01. fleama API完成20分
02. Reactと接続する20分
03. サーバーで常駐させる20分
04. 自由拡張20分
05. 完成と次のステップ15分

本人のものだけ

ログインしていれば何でもできる、ではない

前のレッスンで、ログインした人だけが出品できるようになりました。ですがまだ穴があります。

ログインさえしていれば、他人の商品も書き換えられます。 鈴木さんが田中さんの商品を編集したり、消したりできてしまいます。

ここで認可の出番です。「あなたは誰か」は確かめました。次は「それをしてよいか」です。

出品者と突き合わせる

認証ミドルウェアが req.user を用意してくれているので、それと商品の出品者を比べます。

JavaScript

app.put("/items/:id", requireAuth, (req, res) => { const item = db.prepare("SELECT * FROM items WHERE id = ?").get(Number(req.params.id)); if (!item) { return res.status(404).json({ error: "商品が見つかりません" }); } if (item.owner !== req.user.name) { return res.status(403).json({ error: "この商品は編集できません" }); } // ここから先は、自分の商品だと分かっている });

第5章の入力検証と同じ構図です。手前で確かめ、奥では信じる。

403 は取り消せない

第7章の最初に書いたとおり、401 と 403 は意味が違います。

401 はログインすれば通ります。403 はログインし直しても通りません。他人の商品は、誰としてログインしても他人の商品だからです。

受け取った側は、この違いで「ログイン画面へ送るのか、それとも諦めてもらうのか」を決められます。

404 と 403 のどちらを先に見るか

上の例では 404 を先に見ています。素直な順番です。

ただし、より慎重な作りでは他人の商品には 404 を返すこともあります。403 を返すと「その id の商品は存在する」と教えることになるからです。

どちらが正しいというより、何を隠したいかで決まります。fleama の商品は誰でも一覧で見られるので、存在を隠す意味はありません。ですから素直に 403 を返します。

認証と認可は場所が違う

どこに書くか理由
認証ミドルウェアどのルートでも同じ処理
認可各ルートの中何と突き合わせるかがルートごとに違う

出品は「ログインしていれば誰でも」、編集は「出品者だけ」、購入は「出品者以外」かもしれません。条件がルートごとに違うので、まとめられません。

手を動かす

演習では、自分の出品だけ編集・削除できるようにします。404 と 403 の順番にも気をつけてください。

要件

  1. PUT /items/:id と DELETE /items/:id の両方に requireAuth を掛ける
  2. 商品が無ければ 404、出品者が req.user.name と違えば 403 を返す
  3. 通れば編集は {id, name, owner} を 200 で、削除は 204 を本文なしで返す

入出力例

request("PUT", "/items/1", {"name":"革のスニーカー"}, "token-tanaka") → "200 {"id":1,"name":"革のスニーカー","owner":"田中"}" request("PUT", "/items/2", {"name":"のっとり"}, "token-tanaka") → "403 {"error":"この商品は編集できません"}" request("PUT", "/items/999", {"name":"x"}, "token-tanaka") → "404 {"error":"商品が見つかりません"}" request("PUT", "/items/1", {"name":"x"}) → "401 {"error":"ログインしてください"}" request("DELETE", "/items/1", null, "token-tanaka") → "204 " request("DELETE", "/items/1", null, "token-suzuki") → "403 {"error":"この商品は編集できません"}"

ヒント

初期コードの編集は、誰のものでも書き換えてしまいます。先に商品を取り出して確かめます

順番は 404 が先、403 が後です。存在しないものに権限の話はできません

削除も同じ形で書きます。`requireAuth` を掛けるのを忘れないでください

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

関連レッスン

  • つくる:認証完備

    登録からログイン・出品・編集までを通し、認証を備えたAPIを完成できるようになります。

  • 第7章クイズ

    認証と認可の理解を4択で確認します。

  • fleama API完成

    第4章で作った一覧表と突き合わせ、仕様を満たし切れるようになります。

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

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

  • 認可「この人はこの操作していい人?」のチェック
  • 認証「この人は本当に本人?」のチェック
  • ミドルウェアリクエストとレスポンスの間に挟まる処理関数。
  • 処理計算や代入を表す長方形
main.js
学習モード
エディタを読み込んでいます

メモ

本人のものだけ

⌘S で保存