您好,在为 OAuth 使用 passport.js 时,即使我没有使用会话,我也没有使用中间件

Hi , while using passport.js for OAuth I am getting middleware not used even though I am not using sessions

我是 node.js 的新手,目前正在做我的第一个项目。 在为 OAuth 使用 passport.js 时,它给了我

Error: passport.initialize() middleware not in use
    at IncomingMessage.req.login.req.logIn (C:\Users\Rohit\Documents\Projects\server\node_modules\passport\lib\http\re
quest.js:46:34)

错误,即使我现在没有使用会话。但是当我注释掉我的 'done()' 函数时,它不再显示此错误。据我所知,只有在使用会话时我才必须使用 'passport.initialize()' 。有人可以帮帮我吗!

index.js :-

const express = require('express');
const mongoose = require('mongoose');
const keys = require('./config/keys');
require('./models/User');
require('./services/passport');

const app = express();

mongoose.connect
(
  keys.mongoURI,
  {
    useNewUrlParser : true,
    useCreateIndex : true,
    useUnifiedTopology : true,
  }
)
.then(() => console.log('Mongoose connected ...'))
.catch(err => console.log(err));

require('./routes/authroutes')(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT);

passport.js:-

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('../config/keys');
const mongoose = require('mongoose');

const User = mongoose.model('users');

passport.use(
  new GoogleStrategy
  (
    {
      clientID : keys.googleClientID,
      clientSecret : keys.googleClientSecret,
      callbackURL : '/auth/google/callback'
    },
    (acessToken, refreshToken, profile, done) =>
    {
        //console.log(profile);
        User.findOne({ googleID : profile.id})
          .then(
            (existingUser) =>
            {
              if(existingUser)
              {
                //there is already a user with this emailin our adatbase
                console.log('User already exists!');
                done(null, existingUser);
              }
              else
              {
                //NEW User
                console.log('New User!\n');
                new User({ googleID : profile.id})
                .save()
                .then
                  (
                     user => done(null, user)
                  );
              }
            }
        );
    }
  )
);

谢谢!

In a Connect or Express-based application, passport.initialize() middleware is required to initialize Passport. If your application uses persistent login sessions, passport.session() middleware must also be used.

http://www.passportjs.org/docs/downloads/html/

passport.initialize() 是一个中间件,您应该使用它来初始化 Passport。这是您遇到的错误。

在声明路由之前添加passport.initialize()

const express = require('express');
const mongoose = require('mongoose');
const passport = require('passport'); // Calling passport
const keys = require('./config/keys');
require('./models/User');
require('./services/passport'); // Calling the passport setup you've defined in passport.js

const app = express();
app.use(passport.initialize());

mongoose.connect
(
  keys.mongoURI,
  {
    useNewUrlParser : true,
    useCreateIndex : true,
    useUnifiedTopology : true,
  }
)
.then(() => console.log('Mongoose connected ...'))
.catch(err => console.log(err));

require('./routes/authroutes')(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT);

参考:http://www.passportjs.org/docs/downloads/html/

如果您正在使用会话,则需要在 index.js 文件中如下所示指定。

app.use(passport.initialize());
app.use(passport.session());

此外,将 serializeUserdeserializeUser 添加到护照设置(您的 passport.js 文件)

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('../config/keys');
const mongoose = require('mongoose');

const User = mongoose.model('users');

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(
  new GoogleStrategy
  (
    {
      clientID : keys.googleClientID,
      clientSecret : keys.googleClientSecret,
      callbackURL : '/auth/google/callback'
    },
    (acessToken, refreshToken, profile, done) =>
    {
        //console.log(profile);
        User.findOne({ googleID : profile.id})
          .then(
            (existingUser) =>
            {
              if(existingUser)
              {
                //there is already a user with this emailin our adatbase
                console.log('User already exists!');
                done(null, existingUser);
              }
              else
              {
                //NEW User
                console.log('New User!\n');
                new User({ googleID : profile.id})
                .save()
                .then
                  (
                     user => done(null, user)
                  );
              }
            }
        );
    }
  )
);

根据命名约定,我建议您将 passport.js 重命名为 passport-setup.js,因为这可能会造成混淆。另外,这是一个很好的做法。

希望这个回答对您有所帮助。

谢谢。