1. 正しいパスワードでトークンがもらえる
  2. パスワードが違えば401
  3. いない利用者でも同じ文言
  4. トークンを添えれば出品でき、出品者が入る
  5. トークン無しの出品は401
  6. 他人の商品は編集できない
  7. 自分の商品なら編集できる
  8. 無い商品は404
コース一覧
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分

つくる:認証完備

新しいことは出てきません

この回では、新しい知識は 1 つも出てきません。第7章で書いたものを 1 つにまとめて、登録からログイン、出品、編集までを通します。

通しで見ると流れが分かる

プレーンテキスト

1. POST /register 名前とパスワードを送る → 利用者ができる 2. POST /login 名前とパスワードを送る → トークンをもらう 3. POST /items トークンを添えて出品 → 自分の商品として登録される 4. PUT /items/:id トークンを添えて編集 → 自分のものだけ通る

1 と 2 は似ていますが、役割が違います。登録は利用者を作る、ログインはその人だと確かめて引換券を渡すです。

3つのコードの住み分け

第7章で、断り方が 3 つに分かれました。

コードいつ直せるか
401誰だか分からないログインすれば通る
403誰かは分かるが権限が無いログインし直しても通らない
404対象が存在しない対象を変えれば通る

見る順番は 401 → 404 → 403 です。認証はミドルウェアで先に済み、その後で存在を見て、最後に権限を見ます。

守るものと開けておくもの

すべてを守ればよいわけではありません。

JavaScript

app.get("/items", ...); // 誰でも見られる app.post("/items", requireAuth, ...); // 出品はログイン必須 app.put("/items/:id", requireAuth, ...); // さらに本人だけ

商品を見るのは誰でもできて、出品はログインした人、編集は出品者だけ。段階的に狭めていくのが自然な設計です。

ここまでに手に入れたもの

何をどのレッスンで
認証と認可を分ける認証と認可
元に戻せない形で保存するパスワードハッシュ
引換券を発行するログインとトークン
ミドルウェアで止める保護ルート
出品者と突き合わせる本人のものだけ

手を動かす

演習では、登録からログイン、出品、編集までを備えた API を組み立てます。第7章の総仕上げです。

要件

  1. POST /login はハッシュを照合し、通れば {"token":"token-<名前>"} を 200 で返す(失敗は 401)
  2. POST /items は requireAuth を掛け、req.user.name を出品者として 201 で返す
  3. PUT /items/:id は 404 → 403 の順に確かめ、通れば更新後の商品を 200 で返す

入出力例

request("POST", "/login", {"name":"田中","password":"himitsu"}) → "200 {"token":"token-田中"}" request("POST", "/login", {"name":"田中","password":"chigau"}) → "401 {"error":"名前かパスワードが違います"}" request("POST", "/login", {"name":"佐藤","password":"himitsu"}) → "401 {"error":"名前かパスワードが違います"}" request("POST", "/items", {"name":"木製のスツール"}, "token-田中") → "201 {"id":2,"name":"木製のスツール","owner":"田中"}" request("POST", "/items", {"name":"木製のスツール"}) → "401 {"error":"ログインしてください"}" request("PUT", "/items/1", {"name":"のっとり"}, "token-田中") → "403 {"error":"この商品は編集できません"}" request("PUT", "/items/1", {"name":"革のスニーカー"}, "token-鈴木") → "200 {"id":1,"name":"革のスニーカー","owner":"鈴木"}" request("PUT", "/items/999", {"name":"x"}, "token-田中") → "404 {"error":"商品が見つかりません"}"

ヒント

ログインは、利用者を探して、同じ salt でハッシュ化して比べます。失敗の文言は 2 か所とも同じにします

出品と編集には `requireAuth` を 2 つ目の引数として渡します

編集は 404 を先に、403 を後に確かめます

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

関連レッスン

  • 第7章クイズ

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

  • fleama API完成

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

  • 本人のものだけ

    自分の出品だけ編集できるようにし、認可チェックを書けるようになります。

  • 保護ルート

    出品と購入をログイン必須にし、トークンが要るAPIを作れるようになります。

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

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

  • 認証「この人は本当に本人?」のチェック
  • ミドルウェアリクエストとレスポンスの間に挟まる処理関数。
  • 設計何をどう作るかを決める前工程
  • 認可「この人はこの操作していい人?」のチェック
  • パスワードDBが漏洩しても元のパスワードがわからないようにするため。
  • トークンLLM が扱う最小の文字単位
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
main.js
学習モード
エディタを読み込んでいます

メモ

つくる:認証完備

⌘S で保存