在 NextAuth 中更新会话

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

关于实现登录的文章不少,所以不难,但关于更新会话信息的文章较少。

因此,记录一下会话信息更新。

这次我们还是看看 NextAuth 官方文档

在 NextAuth 中更新会话-1

会话信息更新的步骤如下。

  1. 使用 useSession 的 update 对会话进行更新并触发事件

  2. 在 authConfig 中根据触发事件重新设置 jwt

  3. 更新后刷新页面

那么先看看代码。

1. Session 更新

官方文档中的示例如下。

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

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

  if (status === "authenticated") {
    return (
      <>
        <p>Signed in as {session.user.name}</p>
        // 将更新值发送到服务器端
        <button onClick={() => update({ name: "John Doe" })}>Edit name</button>
        // 假设服务器端已更新值。仅触发事件 // 更新所有 `useSession().data`。
        <button onClick={() => update()}>Edit name</button>
      </>
    );
  }

  return <a href="/api/auth/signin">Sign in</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 选项。

触发更新事件后,如果有 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 全栈博客开发记
在第一次接触网页开发大约 1 年之后,我开始想着想要拥有一个属于自己的博客。于是我就大概花了 6 个月几乎只埋头做这件事。前端部分的功能,参考金度亨先生的博客就已经足够了。我用 mdx 搭建起一个博客,其实连一周都没花到。事实上,仅靠前端也并不会给博客运营带来什么大问题。有一阵子我也觉得,只要写 m...
使用 Caddy 实现 Next.js 无停机部署(本地服务器)
使用 Caddy 实现 Next.js 无停机部署(本地服务器)
每次一有想在主页上加点什么的念头就去 build,结果中间好像偶尔会有人访问。于是 Search Console 上的分数开始一点点往下掉。觉得这样不行,就开始思考要怎么做无停机部署。1. 两个项目文件夹 + 两个终端答案出乎意料地简单:开两个终端。在一个终端里 build,另一个终端里让服务器跑着...
谷歌搜索索引自动化 - Web Search Indexing API
谷歌搜索索引自动化 - Web Search Indexing API
继上次搞完 IndexNow 之后,也决定在谷歌这边做一下自动化。查了一下,发现谷歌是通过一个叫 Web Search Indexing 的 API 来支持这个功能的。1. 适用范围官方文档中,这个 API 正式支持的范围是招聘公告和流媒体视频服务。说是为了给对实时性要求高的内容创建索引用的,但搜了...
搜索索引生成自动化 - IndexNow
搜索索引生成自动化 - IndexNow
在向 Bing 提交站点收录时才发现,Bing 提供了一个叫做 IndexNow 的功能。核心在于,可以利用 API Key,在写完文章的瞬间就立刻发起索引请求。只要用 fetch 写出类似下面这样的请求,并把它串联到「写文章」流程里,就可以在把文章保存到 DB 的同时发送索引生成请求。POST /...
被入侵的 Nextjs、React 服务器经历
被入侵的 Nextjs、React 服务器经历
我最初接触到这次安全问题是在 12 月 5 日凌晨。据说在 React 中可以在未认证的情况下进行远程代码执行。看到这条新闻后,我虽然告诉了别人,但总觉得自己应该没事,就什么想法也没有地略过了。1. 发现被入侵的痕迹结果当我想登录更新博客代码时,在终端里发现了有命令被执行过的痕迹。/bin/sh:...
在博客中添加多语言功能(NextJS、next-intl、Vercel AI SDK)
在博客中添加多语言功能(NextJS、next-intl、Vercel AI SDK)
最近我觉得博客需要多语言功能。于是决定用 next-intl 来实现多语言服务。1.i18n首先,在做多语言服务时有一些必须遵守的原则。这被称为 internationalization,单词太长,所以把首字母 i 和尾字母 n,以及中间 18 个字母合在一起,写成 i18n。1) i18n 的原则...

댓글을 불러오는 중...