Next.js中Next-Auth集成Google认证出现访问拒绝错误求助
Next-Auth Google认证访问拒绝问题排查与解决建议
问题描述
基于Next.js开发项目,按照教程实现Next-Auth的Google认证功能,选择Google账号的页面可正常显示,但出现访问拒绝错误。已尝试创建新MongoDB Atlas集群、修改密码、多次检查.env文件、使用浏览器VPN、重看教程排查错误,怀疑地域(俄罗斯)问题,但问题仍未解决。
相关代码文件
database.js
import mongoose from 'mongoose'; let isConnected = false; export const connectToDB = async () => { mongoose.set('strictQuery', true); if(isConnected) { console.log('MongoDB уже подключен'); return; } try { await mongoose.connect(process.env.MONGODB_URI, { dbName: "share_prompt", useNewUrlParser: true, useUnifiedTopology: true, }) isConnected = true; console.log("MongoDB подключен") } catch(error) { console.log(error); } }
user.js
import { Schema, model, models } from 'mongoose'; const UserSchema = new Schema({ email: { type: String, unique: [true, "Почта уже существует!"], required: [true, "Требуется почта!"], }, username: { type: String, required: [true, 'Требуется имя пользователя!!'], match: [/^(?=.{8,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$/, "Имя пользователя не подходит, оно должно содержать от 8 до 20 символов и быть уникальным!"] }, image: { type: String, } }) const User = models.User || model("User", UserSchema); export default User;
route.js
import NextAuth from 'next-auth'; import GoogleProvider from "next-auth/providers/google"; import { connectToDB } from '@utils/database'; import User from '@models/user'; const handler = NextAuth({ providers : [ GoogleProvider({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, }), ], callbacks: { async session({ session }) { const sessionUser = await User.findOne({ email: session.user.email }) session.user.id = sessionUser._id.toString(); return session; }, async signIn({ profile }) { try { await connectToDB(); // проверить, существует ли данный пользователь const userExists = await User.findOne({ email: profile.email }); // если не существует, создать новый. if(!userExists) { await User.create({ email: profile.email, username: profile.name.replace(/\s/g, "").toLowerCase(), image: profile.picture }) } } catch (error) { console.log(error); return false; } } } }) export { handler as GET, handler as POST }
解决建议
修复signIn回调的返回值:当前
signIn回调在成功分支没有返回true,NextAuth会默认拒绝登录。修改代码如下:async signIn({ profile }) { try { await connectToDB(); const userExists = await User.findOne({ email: profile.email }); if(!userExists) { await User.create({ email: profile.email, username: profile.name.replace(/\s/g, "").toLowerCase(), image: profile.picture }) } return true; // 必须返回true表示允许登录 } catch (error) { console.log(error); return false; } }检查Google OAuth回调URL配置:在Google Cloud控制台的OAuth 2.0客户端ID设置中,确保授权重定向URI包含开发环境的
http://localhost:3000/api/auth/callback/google,生产环境需替换为对应域名,注意协议(http/https)和端口的正确性。验证MongoDB Atlas配置:
- 检查集群IP白名单,确保当前IP或
0.0.0.0/0(测试用)已被允许访问 - 确认
process.env.MONGODB_URI的格式正确,包含正确的用户名、密码和集群地址 - 查看控制台日志,排查是否有用户创建失败的错误(比如用户名不符合正则规则导致的创建失败)
- 检查集群IP白名单,确保当前IP或
地域问题处理:
- 使用全局VPN确保Google OAuth和MongoDB Atlas的连接稳定
- 检查Google Cloud项目的区域设置,确认无地域限制
- 尝试更换代理节点,避免网络波动导致的请求失败
基础配置验证:
- 确认
.env文件中的GOOGLE_ID和GOOGLE_CLIENT_SECRET无多余空格或换行,完全匹配Google Cloud控制台的内容 - 核对NextAuth版本与教程一致,不同版本可能存在配置参数差异
- 确认
内容的提问来源于stack exchange,提问作者qwe123 sad
相关产品推荐
相关产品推荐

