NextAuthでセッションを更新する

힘센캥거루
2025년 1월 13일(수정됨)
3
87

ログインの実装までは情報が多くて難しくなかったが、セッション情報を更新することについては少なかった。

それで一度書いてみるセッション情報の更新。

今回も見てみるのはやはりNextAuthの公式ドキュメントである。

NextAuthでセッションを更新する-1

セッション情報の更新手順は以下の通り。

  1. useSessionのupdateでセッション更新およびトリガー発生

  2. authConfigでupdateトリガーに従ったjwt再設定

  3. 更新後、ページをリフレッシュ

ではコードをまず見てみよう。

1. セッション更新

まず公式ドキュメントにある例は以下の通り。

import { useSession } from "next-auth/react";

export default function Page() {
  const { data: session, status, update } = useSession();

  if (status === "authenticated") {
    return (
      <>
        <p>サインイン中:{session.user.name}</p>
        // 更新値をサーバー側に送信
        <button onClick={() => update({ name: "John Doe" })}>名前を編集</button>
        // サーバー側ですでに値を更新したと仮定して、トリガのみ実行 // 全ての`useSession().data`が更新
        <button onClick={() => update()}>名前を編集</button>
      </>
    );
  }

  return <a href="/api/auth/signin">サインイン</a>;
}

簡単にしたければ、updateにパラメータとしてオブジェクトを入れれば良い。

自分のホームページにも一度適用してみた。

必要のないコードは簡潔にしてコメントを付け加えてみた。

"use client";

import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";

export default function Profile() {
  const router = useRouter();
  const { update } = useSession();

  async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();

    // フォームデータを作成しデータ注入
    const formData = new FormData();
    formData.append("nickName", value);

    // api fetchを介してバックエンド更新
    const res = await fetch("/api/editProfile", {
      method: "POST",
      body: formData,
    });
    const resJson = await res.json();

    // 成功すればupdateでセッション更新およびトリガー実行
    if (resJson.success === "success") {
      // データをオブジェクト形式にして更新
      const updateObj: Record<string, string | boolean> = {};
      userInputTable.forEach((each: userInputTableObj) => {
        updateObj[each.name] = each.value as string;
      });

      // 更新を待ってリフレッシュしたくてawait
      await update(updateObj);

      // セッション更新でnavbar更新のためリフレッシュ
      router.refresh();
    }
  }
  return (
    <form onSubmit={(e) => handleSubmit(e)}>
      <input
        // userInput.valueは大体useStateで設定したもの
        value={userInput.value}
        onChange={(e) => handleChange(e)}
      />
        <button type="submit">登録</button>
    </form>
  );
}

ポイントはupdateでオブジェクトとしてセッション情報を更新することだ。

では更新されたセッションでトークンを更新しよう。

2. AuthOptions

公式ドキュメントには大体以下のように書かれている。

NextAuthのパラメータの一つであるcallbacksにjwtオプションを与える。

updateトリガが発生し、session.nameがあればトークンを更新する。

...
export default NextAuth({
  // 中略 ...
  callbacks: {
    jwt({ token, trigger, session }) {
        // セッションは任意のオブジェクトなので検証が必要
      if (trigger === "update" && session?.name) {
        token.name = session.name
      }
      return token
    }
  }
})

これはほとんど変更するところがないのでそのまま適用した。

このようにするとセッション更新は完了だ。

3. テストする

NextAuthでセッションを更新する-2

ではログイン後、プロフィールのニックネームを変更しながらテストしてみよう。

ニックネームを変えながらSSRで実装したnavbarのプロフィールがちゃんと変わるか確認してみた。

うまくいっているようだ。

4. 感想

NextAuthでセッションを更新する-3

思ったよりもセッション更新は簡単に実装できた。

検索もたくさんしたが、結局は巡り巡って公式ドキュメントだった。

何かうまくいかないときは、まず公式ドキュメントをじっくり読むことをおすすめする。

관련 글

Next.js フルスタックブログ開発記
Next.js フルスタックブログ開発記
Web開発に初めて触れてから1年ほど経った頃、自分だけのブログを持ちたいと思うようになった。そこで、およそ6か月これだけにかかりきりになって作ってみることにした。フロントエンド側の機能については、下記のキム・ドヒョンさんのブログを参考にするだけで十分だと思う。自分も mdx を使ってブログを作るだけ...
Caddyを利用した Next.js 無停止デプロイ(ローカルサーバー)
Caddyを利用した Next.js 無停止デプロイ(ローカルサーバー)
ホームページに何かをちょこちょこ載せたくなるたびにビルドしていたら、そのタイミング에 가끔 접속하는人がいるようだった。そうしているうちに、サーチコンソールでスコアがどんどん下がる現象が起きた。このままではまずいと思い、無停止デプロイをする方法を考えてみることにした。1. プロジェクトフォルダ2つ+...
Google検索インデックスの自動化 - Web Search Indexing API
Google検索インデックスの自動化 - Web Search Indexing API
前回の IndexNow に続いて、Google でも自動化してみることにした。調べてみると、Google は API として Web Search Indexing というものを提供していた。1. 対象範囲公式にこの API がサポートしている範囲は、求人情報とストリーミング動画サービスである。リ...
検索インデックス生成の自動化 - IndexNow
検索インデックス生成の自動化 - IndexNow
Bingにサイト登録をしている途中で知ったのだが、Bingでは IndexNow という機能を提供している。ポイントは、APIキーを使って、記事を書いた直後にすぐインデックス作成リクエストを飛ばせるということ。下のようなリクエストを fetch で作り、投稿機能に連動させておけば、記事をDBに保存す...
Nextjs、React サーバーがハッキングされた経験
Nextjs、React サーバーがハッキングされた経験
最初にセキュリティ問題に気づいたのは、12月5日の未明だった。React で認証なしにリモートコード実行が可能だということ。そのニュースを見て他の人には共有したものの、自分は大丈夫だろうと思って特に気にも留めなかった。1. ハッキングの痕跡を発見ところが、ブログのコードを更新しようとアクセスしてみる...
ブログに多言語機能を追加する(NextJS・next-intl・Vercel AI SDK)
ブログに多言語機能を追加する(NextJS・next-intl・Vercel AI SDK)
最近、ブログに多言語対応機能が必要だと感じた。そこで next-intl を使って多言語サービスを実装してみることにした。1.i18nまず多言語サービスを行うときには、守るべき原則がある。これを internationalization と呼ぶが、かなり長いので、先頭の i と末尾の n、そしてその...

댓글을 불러오는 중...