Node.js集成Passport谷歌认证时遇passport.use不是函数错误求助
问题:TypeError: passport.use is not a function
运行Passport谷歌认证时出现以下错误:
passport.use(new GoogleStrategy({ ^ TypeError: passport.use is not a function at Object. (D:\My Data\Works\React\Google authentication\auth.js:6:10) at Module._compile (node:internal/modules/cjs/loader:1256:14) at Module._extensions..js (node:internal/modules/cjs/loader:1310:10) at Module.load (node:internal/modules/cjs/loader:1119:32) at Module._load (node:internal/modules/cjs/loader:960:12) at Module.require (node:internal/modules/cjs/loader:1143:19) at require (node:internal/modules/cjs/helpers:110:18) at Object. (D:\My Data\Works\React\Google authentication\index.js:6:1) at Module._compile (node:internal/modules/cjs/loader:1256:14) at Module._extensions..js (node:internal/modules/cjs/loader:1310:10) Node.js v18.16.1
现有代码
auth.js
const passport = require("passport-google-oauth2"); const GoogleStrategy = require( 'passport-google-oauth2' ).Strategy; require('dotenv').config() passport.use(new GoogleStrategy({ clientID: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, callbackURL: "http://localhost:5000/auth/google/callback", passReqToCallback : true }, function(request, accessToken, refreshToken, profile, done) { done(null,profile); } )); passport.serializeUser((user,done)=>{ done(null,profile) }); passport.deserializeUser((user,done)=>{ done(null,user); })
index.js
const express = require('express'); const passport = require('passport-google-oauth2'); const session = require('express-session') const path = require('path'); const app = express(); require('./auth'); app.use(express.json()); app.use(express.static(path.join(__dirname,'client'))); function isLoggedIn(req,res,next){ req.user ? next() : res.sendStatus(401) } app.get('/',(req,res) => { res.sendFile(index.html); }); //IMPORTANT TO SET COOCKIES app.use(session({ secret: 'mysecret', resave: false, saveUninitialized: true, cookie: { secure: false } } )); app.use(passport.initialize()); app.use(passport.session()); //TILL HERE app.get('/auth/google', passport.authenticate('google', { scope: [ 'email', 'profile' ] } )); app.get( '/auth/google/callback', passport.authenticate( 'google', { successRedirect: '/auth/google/success', failureRedirect: '/auth/google/failure' })); app.get('/auth/google/failure',isLoggedIn,(req,res) => { res.send("Something went wrong"); }); app.get('/auth/protected',isLoggedIn,(req,res) => { let name = req.user.displayName; res.send(`Hello ${name}`); }); app.use('/auth/logout',(req,res) => { req.session.destroy(); res.send('see you again'); }) app.listen(5000,() => { console.log('listening on port 5000'); });
解决方案
核心问题是错误地将passport-google-oauth2作为Passport核心实例引入,而非官方的passport包,同时代码存在几处细节错误,修改如下:
- 安装核心Passport包
确保已安装passport:
npm install passport
- 修正auth.js代码
const passport = require("passport"); // 改为引入核心passport包 const GoogleStrategy = require('passport-google-oauth2').Strategy; require('dotenv').config() passport.use(new GoogleStrategy({ clientID: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, callbackURL: "http://localhost:5000/auth/google/callback", passReqToCallback: true }, function(request, accessToken, refreshToken, profile, done) { done(null, profile); } )); passport.serializeUser((user, done)=>{ done(null, user); // 修复变量错误:参数是user而非profile }); passport.deserializeUser((user, done)=>{ done(null, user); })
- 修正index.js代码
const express = require('express'); const passport = require('passport'); // 改为引入核心passport包 const session = require('express-session') const path = require('path'); const app = express(); require('./auth'); app.use(express.json()); app.use(express.static(path.join(__dirname,'client'))); function isLoggedIn(req,res,next){ req.user ? next() : res.sendStatus(401) } app.get('/',(req,res) => { res.sendFile(path.join(__dirname, 'client', 'index.html')); // 补全index.html的正确路径 }); //IMPORTANT TO SET COOCKIES app.use(session({ secret: 'mysecret', resave: false, saveUninitialized: true, cookie: { secure: false } } )); app.use(passport.initialize()); app.use(passport.session()); //TILL HERE app.get('/auth/google', passport.authenticate('google', { scope: [ 'email', 'profile' ] }) ); app.get( '/auth/google/callback', passport.authenticate( 'google', { successRedirect: '/auth/protected', // 原successRedirect路径未定义,改为直接跳转到受保护路由 failureRedirect: '/auth/google/failure' })); app.get('/auth/google/failure',(req,res) => { // 失败路由无需isLoggedIn中间件,否则会返回401 res.send("Something went wrong"); }); app.get('/auth/protected',isLoggedIn,(req,res) => { let name = req.user.displayName; res.send(`Hello ${name}`); }); app.get('/auth/logout',(req,res) => { // 用GET请求更符合HTTP规范 req.session.destroy(); res.send('see you again'); }) app.listen(5000,() => { console.log('listening on port 5000'); });
内容的提问来源于stack exchange,提问作者Shivranjan Bharadwaj
相关产品推荐
相关产品推荐

