コース一覧
    Node.js認証・本番運用
    ログインとトークン

    Node.js認証・本番運用

    認証、認可、フロントエンド連携、本番運用を学び、Node.jsで保守可能なサービスを完成させられるようにします。

    1
    認証のきほん
    01. 認証と認可15分
    02. パスワードハッシュ15分
    03. ログインとトークン15分
    04. 保護ルート15分
    05. 本人のものだけ15分
    06. つくる:認証完備20分
    07. 第7章クイズ10分
    2
    総合制作
    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 を返す(失敗時の文言は両方同じ)

    ヒント

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

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

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

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

    関連レッスン

    • 保護ルート

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

    • 本人のものだけ

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

    • つくる:認証完備

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

    • 第7章クイズ

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

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

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

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

    メモ

    ログインとトークン

    ⌘S で保存