1. 正しい名前とパスワード
  2. パスワードが違うとき
  3. 存在しない名前でも、同じ文言を返す
コース一覧
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. ログイン 名前とパスワードを送る → トークンをもらう 2. その後 トークンだけを送る

ログインの処理

照合は、前のレッスンの逆をたどるだけです。

JavaScript

const user = db.prepare("SELECT * FROM users WHERE name = ?").get(name); if (!user) { return res.status(401).json({ error: "名前かパスワードが違います" }); } const hashed = crypto.scryptSync(password, user.salt, 32).toString("hex"); if (hashed !== user.password_hash) { return res.status(401).json({ error: "名前かパスワードが違います" }); }

失敗の理由を分けない

上の 2 つの if は、どちらも同じ文言を返しています。わざとです。

JavaScript

// 避けたい if (!user) return res.status(401).json({ error: "その利用者は存在しません" });

こう分けると、「存在しません」が返るかどうかで誰が登録しているかを外から調べられます。名前の一覧を作られ、そこにパスワードを試されます。

利用者には少し不親切ですが、まとめて「名前かパスワードが違います」と返します。

トークンを作る

JavaScript

const token = crypto.randomUUID(); db.prepare("UPDATE users SET token = ? WHERE id = ?").run(token, user.id);

randomUUID は、推測できない文字列を作る関数です。これを保存しておき、次のリクエストで送られてきたものと突き合わせます。

トークンは推測できてはいけません。 user.id や名前をもとに作ると、他人になりすませます。

トークンは短命にする

実務では、トークンに期限を付けます。漏れたときの被害を、その期限までに抑えるためです。

このコースでは期限までは扱いませんが、トークンはパスワードと同じくらい大切なものだという感覚は持ってください。持っている人は、その人として振る舞えます。

手を動かす

演習では、ログイン API を作ります。失敗の理由を分けないことにも気をつけてください。

要件

  1. 名前で利用者を探し、見つからなければ 401
  2. パスワードを同じ salt でハッシュ化し、保存されたものと違えば 401
  3. 通れば crypto.randomUUID() でトークンを発行し、200 を返す(失敗時の文言は両方同じ)

入出力例

login("田中", "himitsu") → {"error":null,"hasToken":true,"status":200} login("田中", "chigau") → {"error":"名前かパスワードが違います","hasToken":false,"status":401} login("鈴木", "himitsu") → {"error":"名前かパスワードが違います","hasToken":false,"status":401}

ヒント

初期コードはパスワードを照合していないので、誰でもログインできてしまいます

送られてきたパスワードを `user.salt` でハッシュ化し、`user.password_hash` と比べます

失敗のときに返すオブジェクトを 1 つ作っておけば、2 か所で同じものを返せます

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

関連レッスン

  • 保護ルート

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

  • 本人のものだけ

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

  • つくる:認証完備

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

  • 第7章クイズ

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

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

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

  • パスワードDBが漏洩しても元のパスワードがわからないようにするため。
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • ハッシュ化元に戻せない一方向変換でパスワードを保管
  • トークンLLM が扱う最小の文字単位
  • 処理計算や代入を表す長方形
  • 関数処理に名前を付けて再利用できる単位
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
main.js
学習モード
エディタを読み込んでいます

メモ

ログインとトークン

⌘S で保存