如何强制NextAuth/Azure AD每次调用signIn()都要求用户输入凭证?
解决NextAuth/Azure AD登出后无需凭证即可重新登录的问题
这个问题的核心是Azure AD默认会保留用户的会话Cookie,即使通过NextAuth的signOut()清除了应用内的会话,Azure端的会话依然存在,导致再次调用signIn()时会自动完成认证。要强制每次登录都要求用户输入凭证,可以从两个方面入手:
一、强制登录时要求Azure AD重新验证
NextAuth 4 配置方式
1. 全局强制验证(Provider层面)
修改[...nextauth].js配置,给Azure AD Provider的authorization参数添加prompt: "login",让所有登录请求都强制要求输入凭证:
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, authorization: { params: { prompt: "login" } } }) ], // 其他配置项... })
2. 特定场景强制验证(调用signIn时指定)
如果只需要在部分场景下强制用户重新输入凭证,可以在调用signIn()时传递参数:
signIn('azure-ad', { prompt: 'login' })
NextAuth 5(Auth.js)配置方式
NextAuth 5已更名为Auth.js,配置逻辑一致:
1. 全局强制验证(Provider层面)
修改auth.config.js:
import { NextAuthConfig } from "next-auth" import AzureAD from "next-auth/providers/azure-ad" export default { providers: [ AzureAD({ clientId: process.env.AZURE_AD_CLIENT_ID, clientSecret: process.env.AZURE_AD_CLIENT_SECRET, tenantId: process.env.AZURE_AD_TENANT_ID, authorization: { params: { prompt: "login" } } }) ], // 其他配置项... } satisfies NextAuthConfig
2. 特定场景强制验证(调用signIn时指定)
signIn('azure-ad', { prompt: 'login' })
二、登出时同步清除Azure AD会话
仅清除NextAuth的应用会话不够,需要在登出时跳转到Azure AD的登出页面,彻底清除Azure端的会话Cookie:
NextAuth 4 配置
在[...nextauth].js中添加signOut回调:
export default NextAuth({ // ...其他配置 callbacks: { async signOut({ url }) { // 构造Azure AD登出URL,登出后自动跳转回应用 const azureLogoutUrl = `https://login.microsoftonline.com/${process.env.AZURE_AD_TENANT_ID}/oauth2/v2.0/logout?post_logout_redirect_uri=${encodeURIComponent(url)}` return azureLogoutUrl } } })
NextAuth 5(Auth.js)配置
在auth.config.js中添加signOut回调:
export default { // ...其他配置 callbacks: { async signOut({ url }) { const azureLogoutUrl = `https://login.microsoftonline.com/${process.env.AZURE_AD_TENANT_ID}/oauth2/v2.0/logout?post_logout_redirect_uri=${encodeURIComponent(url)}` return azureLogoutUrl } } } satisfies NextAuthConfig
结合以上两种配置,就能确保每次调用signIn()时,用户必须重新输入Azure AD的凭证才能登录。
内容的提问来源于stack exchange,提问作者Robert Hufsky
相关产品推荐
相关产品推荐

