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

Passport.js集成Google OAuth报错:Unknown authentication strategy 'google'

问题:Passport.js Google OAuth 提示“Unknown authentication strategy 'google'”错误

访问/auth/google路由时持续出现以下错误:

Error: Unknown authentication strategy "google"
    at attempt (/path/to/project/node_modules/passport/lib/middleware/authenticate.js:193:39)
    at authenticate (/path/to/project/node_modules/passport/lib/middleware/authenticate.js:379:7)
    ...

已配置GoogleStrategy并初始化Passport,但问题依旧,相关文件内容如下:

auth.ts(Passport配置文件)

import passport from "passport";
import { Strategy as GoogleStrategy } from "passport-google-oauth20";
import User from "../models/user.model";  // Mongoose User model

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.GOOGLE_CLIENT_ID!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
      callbackURL: "/auth/google/callback",
    },
    async (accessToken, refreshToken, profile, done) => {
      try {
        let user = await User.findOne({ googleId: profile.id });
        if (!user) {
          user = await User.create({
            googleId: profile.id,
            email: profile.emails![0].value,
            displayName: profile.displayName,
            profilePic: profile.photos![0].value,
          });
        }
        done(null, user);
      } catch (error) {
        done(error, undefined);
      }
    }
  )
);

passport.serializeUser((user: any, done) => done(null, user._id));
passport.deserializeUser(async (id: string, done) => {
  try {
    const user = await User.findById(id);
    done(null, user);
  } catch (error) {
    done(error, null);
  }
});

export default passport;

app.ts(主服务器文件)

import express from "express";
import helmet from "helmet";
import cors from "cors";
import morgan from "morgan";
import dotenv from "dotenv";
import mongoose from "mongoose";
import session from "express-session";
import MongoStore from "connect-mongo";
import passport from "./auth";  // 导入已配置的Passport实例
import authRoute from "./routes/auth";  // 认证路由

dotenv.config();
const app = express();

// 中间件
app.use(helmet());
app.use(cors());
app.use(morgan("dev"));
app.use(express.json());

app.use(
  session({
    secret: process.env.SESSION_SECRET!,
    resave: false,
    saveUninitialized: false,
    store: MongoStore.create({ mongoUrl: process.env.MONGODB_URI! }),
    cookie: {
      secure: process.env.NODE_ENV === "production",
      sameSite: process.env.NODE_ENV === "production" ? "none" : "lax",
      maxAge: 24 * 60 * 60 * 1000, // 24小时
    },
  })
);

// 初始化Passport
app.use(passport.initialize());
app.use(passport.session());

// MongoDB连接
mongoose
  .connect(process.env.MONGODB_URI!)
  .then(() => console.log("Mongodb connected successfully"))
  .catch((err) => console.error(err));

// 路由
app.use("/auth", authRoute);

const port = process.env.PORT || 8000;
app.listen(port, () => {
  console.log(`Server listening on port ${port} http://localhost:${port}`);
});

auth.ts(路由文件)

import express from "express";
import passport from "../auth";  // 使用相同的Passport实例

const router = express.Router();

router.get(
  "/google",
  passport.authenticate("google", { scope: ["profile", "email"] })
);

router.get(
  "/google/callback",
  passport.authenticate("google", { failureRedirect: "/login" }),
  (req, res) => {
    res.redirect(`${process.env.CLIENT_URL}/dashboard`);
  }
);

export default router;

已安装依赖包

"dependencies": {
    "connect-mongo": "^5.1.0",
    "cors": "^2.8.5",
    "dotenv": "^16.4.5",
    "express": "^4.21.1",
    "express-session": "^1.18.1",
    "helmet": "^8.0.0",
    "mongoose": "^8.7.3",
    "morgan": "^1.10.0",
    "passport": "^0.7.0",
    "passport-google-oauth20": "^2.0.0",
    "passport-local": "^1.0.0"
  },
  "devDependencies": {
    "@types/cors": "^2.8.17",
    "@types/express": "^5.0.0",
    "@types/express-session": "^1.18.0",
    "@types/morgan": "^1.9.9",
    "@types/node": "^22.8.1",
    "@types/passport": "^1.0.17",
    "@types/passport-google-oauth20": "^2.0.16",
    "nodemon": "^3.1.7",
    "ts-node": "^10.9.2",
    "typescript": "^5.6.3"
  }

已验证以下内容:

  • Google OAuth策略在路由使用前已注册
  • 应用中使用的是同一个Passport实例
  • 已安装所有必要依赖包
  • 环境变量密钥均正确

多次重启服务器、重新检查环境变量、确认Passport实例唯一、验证MongoDB连接和会话配置后,错误仍存在。询问错误原因及解决办法。


解决方案

可能的原因及修复步骤:

  1. 显式指定策略名称
    默认情况下GoogleStrategy的名称是'google',但显式指定名称可避免Passport内部解析异常:
passport.use('google', new GoogleStrategy(/* 原有配置项 */));
  1. 调整环境变量加载时机
    确保dotenv.config()在所有模块导入前执行,避免Passport配置时环境变量未就绪:
// app.ts最顶部
import dotenv from "dotenv";
dotenv.config();
// 再导入其他模块
import express from "express";
import passport from "./auth";
...
  1. 检查模块导入路径一致性
    确认所有导入passport的路径完全一致(注意大小写,Linux/macOS区分路径大小写),避免因路径差异导致加载不同的Passport实例。

  2. 验证策略注册状态
    在auth.ts末尾添加打印语句,确认策略是否成功注册:

console.log('已注册策略:', passport._strategies);

启动服务器后查看输出,如果没有google策略,说明策略初始化时存在静默错误(比如环境变量缺失)。

  1. 清除模块缓存
    执行以下命令清除Node模块缓存后重启服务:
rm -rf node_modules/.cache
nodemon --ignore node_modules --exec ts-node --transpile-only app.ts

内容的提问来源于stack exchange,提问作者Krishnadev. V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:42:03