简体中文
  • webauthn
  • passkey
  • mfa
  • nextjs

在 Next.js 中实现 WebAuthn:动手指南

一个动手实践指南,讲解如何在 Next.js 中实现 WebAuthn,包含实时代码示例。

Sijie
Sijie
Developer

不要在用户认证上浪费数周时间
使用 Logto 更快地发布安全应用。几分钟内集成用户认证,专注于您的核心产品。
立即开始
Product screenshot

欢迎回到我们的 WebAuthn 系列。在我们之前的文章中,我们介绍了 WebAuthn 的基础知识,以及一个 101 指南。如果你刚刚加入,请随时查看这些基础文章以快速了解。

今天,我们将卷起袖子,把理论付诸实践。我们将利用 Next.js 的新特性“Server Actions”。我们的目标是什么?在 Next.js 应用中实现 WebAuthn,并为 WebAuthn 做好准备。

在我们深入编码的海洋之前,先看一下你在旅程结束时可以期待什么-一个功能齐全的演示网站。探索它,看看 WebAuthn 的实际应用,并了解你将要构建的内容。在这个演示网站中,你可以注册新用户并用刚刚注册的 passkey 登录。

预览

对于那些倾向于持有地图的人,我们为你提供帮助!我们将讨论的所有代码都可以在我们的公共 GitHub 仓库 中找到。这个仓库是你的伴侣指南,提供我们实现的完整源代码。

准备好踏上这次激动人心的冒险了吗?让我们开始吧!

前提条件

在我们开始之前,确保我们拥有一切所需:

  1. 一个 Next.js 项目:如果你还没有设置一个 Next.js 项目,这里有一个快速指南 帮助你开始。
  2. 简单 WebAuthn 库:几个包可以帮助减少将 WebAuthn 集成到网站所需的工作量。使用你喜欢的包管理器安装 @simplewebauthn/browser@simplewebauthn/server@simplewebauthn/typescript-types
  3. 会话存储:我们将使用会话存储来管理 WebAuthn 挑战。我们将使用 vercel 的 KV 来实现这一目标。
  4. 用户数据库:一个存储我们用户注册的 passkey 的地方。为了简化演示,我们也将使用 vercel 的 KV。

现在,随着我们的工具和材料在手,我们准备开始构建。

用 Vercel 的 KV 实现会话存储

设置 KV 存储

无论是在生产环境还是本地开发中,初始化一个 KV 存储都很容易,按照这篇指南将 KV 存储连接到你的项目并获取环境值:https://vercel.com/docs/storage/vercel-kv/quickstart

实现会话管理功能

我们导出了两个函数:

  • getCurrentSession:使用 Next.js 的 cookie 助手为当前请求创建一个会话,并返回其值。
  • updateCurrentSession:将数据保存到当前会话中。

用 Vercel 的 KV 实现用户数据库

与我们的会话实现类似,让我们实现一个简单的用户数据库。

我们创建了根据电子邮件查找用户的函数,以及根据电子邮件更新用户数据的函数。记住,这仅用于演示,在实际产品中,用户数据通常存储在数据库中。

准备 WebAuthn 功能

在我们继续之前,让我们看看注册和认证流程的图表:

如你所见,我们需要准备两个函数:

  1. generateWebAuthnRegistrationOptions
  2. verifyWebAuthnRegistration

类似于注册,登录需要两个函数:

  1. generateWebAuthnLoginOptions
  2. verifyWebAuthnLogin

以下是代码:

构建网页

我们已经完成了准备工作,让我们构建页面:

结论

恭喜你通过在 Next.js 应用中实现 WebAuthn 的复杂性。作为结束,重要的是要解决在生产环境中部署它的一些关键考虑因素。

生产部署的关键考虑

  1. 用户标识符调整:在本教程中,我们使用电子邮件地址作为用户标识符。然而,在生产环境中,你可能需要使用不同的标识符,比如 userIdusername
  2. 数据库集成:虽然我们使用 Vercel 的 KV 作为简单的演示来管理会话和用户数据,但一个真实世界的应用应该集成一个更强大的数据库系统(如 PostgreSQL、MongoDB 等)。
  3. 自定义 WebAuthn 选项:我们探索的 WebAuthn 选项是一个起点。根据你的应用需求和安全策略,你可能需要调整这些设置。查阅 WebAuthn 文档Simple WebAuthn 库的文档 以获取关于定制这些选项以满足你特定需求的指导。

感谢你加入我们的教育探险。即便在这个最小的示例中,集成 WebAuthn 也不是一个简单的任务,还有另一种选择,尝试 Logto 的多因素认证中的 WebAuthn: