如何在next-auth v4中配置CognitoProvider传递identity_provider
Next-auth v4 集成AWS Cognito第三方登录(跳过默认UI)
问题背景
项目环境:
- Next.js 14
- AWS Cognito(已集成Google、Facebook登录,第三方登录需重定向至Cognito托管UI)
- next-auth v4 管理用户会话
原旧版本next-auth中,通过CognitoProvider的authorize方法传递identity_provider参数,实现跳过Cognito默认UI直接进入对应第三方登录界面,但该写法在v4中失效,需适配v4的实现方式。
解决方案
方案1:调用signIn时直接传递identity_provider参数
直接在signIn的选项中添加identity_provider参数,next-auth会自动将该参数附加到Cognito的授权请求URL中:
import { signIn } from 'next-auth/react'; // Google登录 await signIn('cognito', { callbackUrl: '/your-callback-path', identity_provider: 'Google' }); // Facebook登录 await signIn('cognito', { callbackUrl: '/your-callback-path', identity_provider: 'Facebook' });
方案2:配置CognitoProvider的authorization参数
如果需要统一设置基础授权参数,可在CognitoProvider中配置authorization的params,再结合signIn传递动态参数:
import CognitoProvider from 'next-auth/providers/cognito'; CognitoProvider({ clientId: process.env.CLIENT_ID, clientSecret: process.env.CLIENT_SECRET, issuer: process.env.ISSUER, authorization: { params: { scope: 'openid email profile', // 基础授权范围 }, }, });
调用signIn时传递的identity_provider会自动附加到上述配置的参数中,生成符合需求的Cognito授权URL。
方案3:自定义授权URL跳转(兜底方案)
若以上方法不符合需求,可直接构造Cognito的授权URL并跳转,后续由next-auth的回调处理会话:
const handleSocialLogin = (provider) => { const cognitoDomain = process.env.COGNITO_DOMAIN; const clientId = process.env.CLIENT_ID; const callbackUrl = encodeURIComponent(`${window.location.origin}/api/auth/callback/cognito`); const identityProvider = provider === 'google' ? 'Google' : 'Facebook'; const authUrl = `${cognitoDomain}/oauth2/authorize?response_type=code&client_id=${clientId}&redirect_uri=${callbackUrl}&scope=openid email profile&identity_provider=${identityProvider}`; window.location.href = authUrl; }; // 使用示例 handleSocialLogin('google');
说明
next-auth v4中,authorize方法的职责仅为验证用户凭证并返回用户信息,不再负责修改授权请求的参数。授权请求的参数需通过signIn选项或provider的authorization配置来传递,这是v4与旧版本的核心差异。
内容的提问来源于stack exchange,提问作者joelat444
相关产品推荐
相关产品推荐

