SvelteKit项目Docker容器中使用auth.js登录报Error 403
在SvelteKit项目中使用auth.js,计划通过Docker部署到租赁服务器。本地开发环境下auth.js运行完全正常,但启动Docker容器后尝试登录时抛出Error 403错误,不清楚问题原因。
docker-compose.yml 配置
services: web: container_name: project_name image: username/project_name:1.0 restart: always ports: - '3000:3000' env_file: - .env.production command: node /app/build/index.js
SvelteKit中auth.js实现代码
const prisma = new PrismaClient(); const auth = SvelteKitAuth({ //@ts-ignore adapter: PrismaAdapter(prisma), //secret: AUTH_SECRET, trustHost: true, debug:true, providers: [ Spotiy({ clientId: SPOTIFY_CLIENT_ID, clientSecret: SPOTIFY_CLIENT_SECRET, }), Google({ clientId: GOOGLE_CLIENT_ID, clientSecret: GOOGLE_CLIENT_SECRET }), ] as any, pages : { error: '/error' }, }) satisfies Handle;
缺失生产环境必需的AUTH_SECRET
代码中注释掉了secret: AUTH_SECRET配置,生产环境下auth.js必须依赖这个密钥加密会话、验证请求签名,缺失会直接导致403权限错误。
解决:取消注释该行,确保.env.production中配置了AUTH_SECRET(可通过openssl rand -hex 32生成安全密钥),且Docker容器能正确读取该环境变量。第三方登录回调URL不匹配
本地开发用localhost相关回调URL,但部署到服务器后,Spotify、Google的OAuth配置里的回调URL必须更新为服务器域名(例如https://你的域名/api/auth/callback/spotify、https://你的域名/api/auth/callback/google),否则第三方平台会拒绝回调请求,引发403。
解决:登录Spotify开发者平台和Google云平台,更新对应OAuth应用的回调URL为生产环境域名下的正确路径。Provider拼写错误
代码中Spotiy是拼写错误,正确应为Spotify,该错误会导致Spotify登录Provider无法加载,认证流程中断引发403。
解决:修正拼写错误,将Spotiy改为Spotify。环境变量加载异常
检查.env.production中的SPOTIFY_CLIENT_ID、GOOGLE_CLIENT_ID等变量是否配置正确,且Docker容器是否成功加载该环境文件。可进入容器执行echo $SPOTIFY_CLIENT_ID等命令验证变量是否存在。
解决:确保.env.production路径正确,文件内变量无语法错误(如无多余空格),容器启动时能正确读取该文件。TrustHost配置与反向代理不兼容
如果服务器使用Nginx等反向代理,需确保反向代理正确传递Host头给容器,否则trustHost: true无法正确识别请求主机名,导致auth.js验证失败。
解决:在反向代理配置中添加proxy_set_header Host $host;,或在auth.js中明确指定host: process.env.AUTH_HOST(需在.env.production中配置AUTH_HOST为服务器域名)。
内容的提问来源于stack exchange,提问作者jwmd

