在开发Web应用程序时,不可避免的一件事就是“身份验证功能”的实现。 然而,从头开始自己实现密码哈希、会话管理、CSRF 对策、OAuth 集成等会带来很高的安全风险,并且需要大量的开发成本。
因此,这次我们将介绍一些使用“NextAuth.js”(目前为 Auth.js)实现安全身份验证的最佳实践,它是 Next.js 环境中身份验证的事实标准。
最佳实践 1:基本上优先考虑 OAuth(社交登录)
管理自己的密码意味着您面临信息泄露的风险。 使用 NextAuth.js 时,首先考虑引入社交登录(OAuth 提供商),例如 Google 或 GitHub。设置提供程序非常简单,只需在配置文件中写入客户端 ID 和 Secret 并添加几行代码即可创建强大的身份验证系统。也省去了用户记住密码的麻烦,有利于提高注册率。
最佳实践2:JWT和数据库会话的区别使用
使用 NextAuth.js,您可以选择两种类型的会话保留方法:“JWT(JSON Web 令牌)”和“数据库会话”。
- JWT 的优点: 无需数据库查询,从而实现更快的响应时间和更轻松的扩展。默认情况下建议这样做。
- 数据库会话的优点: 会话可以轻松地立即失效(例如,管理员强制特定用户注销)。
根据您的要求进行设计,例如需要高安全控制的业务系统的数据库会话,以及面向性能的消费应用程序的 JWT。
最佳实践 3:使用中间件确保路由保护
通过将 NextAuth.js 与 Next.js 12 及更高版本中引入的中间件功能相结合,您可以坚决阻止对特定页面(例如“/dashboard/*”)的未经授权的访问。 在组件内使用“useSession”进行重定向的传统方法存在瞬时屏幕闪烁 (FOUC) 的问题,但通过使用在边缘端运行的中间件,可以在用户看到登录屏幕之前无缝重定向到登录屏幕。
最佳实践 4:严格管理密钥
要在生产环境中运行 NextAuth.js,需要设置环境变量“NEXTAUTH_SECRET”。 这是用于加密令牌的最重要的密钥,如果它被泄露,将直接导致重大漏洞。请确保您的团队在部署环境(例如Vercel)的环境变量设置屏幕上安全地管理环境变量,并且永远不要将它们提交到源代码(Git)。
避免重新发明轮子,并将身份验证的负担留给受信任的库。这是现代安全网络开发的黄金法则。

