NextAuth的AUTH_REDIRECT_PROXY_URL是否支持GitHub以外的服务商?
NextAuth在Vercel预览部署中实现OAuth代理的解决方案
关于AUTH_REDIRECT_PROXY_URL的局限
AUTH_REDIRECT_PROXY_URL目前仅在GitHub Provider的代码逻辑中实现,并非全局支持所有OAuth Provider,这也是你使用Cognito时无法生效的核心原因。
可行替代方案
1. 动态生成Provider的回调URL
针对Cognito Provider手动配置redirectUri,利用Vercel自动注入的VERCEL_URL环境变量动态适配预览域名:
import NextAuth from "next-auth" import Cognito from "next-auth/providers/cognito" export default NextAuth({ providers: [ Cognito({ clientId: process.env.COGNITO_CLIENT_ID, clientSecret: process.env.COGNITO_CLIENT_SECRET, issuer: process.env.COGNITO_ISSUER, redirectUri: `${process.env.NEXTAUTH_URL}/api/auth/callback/cognito` }) ], // 可在Vercel项目环境变量中设置 NEXTAUTH_URL=https://${VERCEL_URL} })
Vercel预览部署会自动为每个分支生成唯一的VERCEL_URL,通过这个配置可以让回调URL自动适配不同的预览实例。
2. 使用Edge Function做统一跳转代理
编写一个Edge Function转发OAuth回调请求,解决Cognito回调URL无法动态变更的问题:
// app/api/auth/cognito-proxy/route.js export async function GET(request) { const { searchParams } = new URL(request.url) const targetCallbackUrl = new URL(`${process.env.NEXTAUTH_URL}/api/auth/callback/cognito`) // 复制所有OAuth回调参数到目标URL searchParams.forEach((val, key) => targetCallbackUrl.searchParams.append(key, val)) return Response.redirect(targetCallbackUrl) }
然后在Cognito的OAuth配置中,将回调URL设置为这个Edge Function的地址,这样所有预览实例都可以共用这个回调地址,再由Edge Function转发到对应的预览实例。
3. 配置反向代理固定回调地址
如果你的团队有统一的预览代理域名,可以通过NextAuth的basePath配合Vercel重写规则实现:
// next-auth.config.ts export default NextAuth({ basePath: "/auth-proxy", providers: [ Cognito({ // ...其他配置 redirectUri: "https://your-fixed-proxy-domain.com/auth-proxy/api/auth/callback/cognito" }) ] })
在Vercel项目的next.config.js中添加重写规则:
/** @type {import('next').NextConfig} */ const nextConfig = { async rewrites() { return [ { source: "/auth-proxy/:path*", destination: `${process.env.PREVIEW_INSTANCE_URL}/api/auth/:path*` } ] } } module.exports = nextConfig
通过这种方式,固定的回调地址会被转发到当前预览实例的Auth接口。
内容的提问来源于stack exchange,提问作者lightcap
相关产品推荐
相关产品推荐

