Next.js应用集成Azure AD SSO:完整指南(2026-07-18)
如果你正在开发企业级Next.js应用,单点登录(SSO)几乎是必备功能。Azure AD(现在叫Microsoft Entra ID)是目前最广泛使用的身份提供者之一,全球超过3亿企业用户依赖它进行身份管理。今天,我将手把手教你如何在Next.js中集成Azure AD SSO,让用户用办公账号一键登录。
为什么选择Azure AD + Next.js?
企业级安全与兼容性
Azure AD通过OAuth 2.0和OpenID Connect协议提供安全认证,支持MFA(多因素认证)和条件访问策略。例如,某SaaS产品上线SSO后,用户注册转化率提升了42%,因为省去了注册、记密码的麻烦。
工具生态成熟
Next.js的API路由和中间件机制,天然适合处理OAuth流程。配合next-auth库,5行代码即可启动基本配置。
实战步骤:从零到一
1. 在Azure Portal注册应用
- 登录 Azure Portal → 搜索“App registrations” → 新建注册
- 重定向URI 填写你的Next.js应用地址(开发时可用
http://localhost:3000/api/auth/callback) - 记录下客户端ID和租户ID(Tenant ID)
- 在“证书与密码”中生成客户端密钥(保存好,仅可见一次)
2. 安装并配置next-auth
npm install next-auth
在 pages/api/auth/[...nextauth].js 中写入:
import NextAuth from 'next-auth'
import AzureADProvider from 'next-auth/providers/azure-ad'
export default NextAuth({
providers: [
AzureADProvider({
clientId: process.env.AZURE_AD_CLIENT_ID,
clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
tenantId: process.env.AZURE_AD_TENANT_ID,
})
],
callbacks: {
async jwt({ token, account }) {
if (account) token.accessToken = account.access_token
return token
},
async session({ session, token }) {
session.accessToken = token.accessToken
return session
}
}
})
3. 在前端使用Session
用 useSession 和 signIn 实现登录按钮:
import { useSession, signIn, signOut } from 'next-auth/react'
export default function Component() {
const { data: session } = useSession()
if (session) {
return (
<div>
<p>欢迎,{session.user.name}</p>
<button onClick={() => signOut()}>退出</button>
</div>
)
}
return <button onClick={() => signIn('azure-ad')}>用企业账号登录</button>
}
实用建议与避坑指南
数据安全提示
- 始终使用环境变量(
.env.local)存储密钥,切勿硬编码。 - 设置
NEXTAUTH_SECRET:openssl rand -base64 32生成一个强随机字符串。 - Azure AD的令牌默认有效期是1小时,记得在后端验证
exp字段。
常见问题
- 登录后白屏:检查重定向URI是否匹配(包括协议、域名、端口)。
- 角色权限不足:在Azure AD中为企业应用分配用户或组,并利用
session中的roles字段控制页面访问。
行动号召:现在就开始集成
SSO不仅提升用户体验,更是企业级应用的标配。花30分钟跟随本文设置,你的Next.js应用就能无缝对接Azure AD。立即动手,在开发环境测试完成后,记得为生产环境配置多端重定向URI和CORS策略。
免责声明:本文提供的代码和配置仅用于技术指导。实际部署前,请确保与你的信息安全团队确认Azure AD的合规性设置。微软可能更新API,建议参考 Microsoft官方文档 进行验证。对于因使用本文内容导致的任何损失,作者不承担法律责任。