You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的格式正确,包含正确的用户名、密码和集群地址
    • 查看控制台日志,排查是否有用户创建失败的错误(比如用户名不符合正则规则导致的创建失败)
  • 地域问题处理:

    • 使用全局VPN确保Google OAuth和MongoDB Atlas的连接稳定
    • 检查Google Cloud项目的区域设置,确认无地域限制
    • 尝试更换代理节点,避免网络波动导致的请求失败
  • 基础配置验证:

    • 确认.env文件中的GOOGLE_ID和GOOGLE_CLIENT_SECRET无多余空格或换行,完全匹配Google Cloud控制台的内容
    • 核对NextAuth版本与教程一致,不同版本可能存在配置参数差异

内容的提问来源于stack exchange,提问作者qwe123 sad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:04:55