首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嗨,当我使用passport.js进行OAuth时,即使我没有使用会话,我也得到了不使用的中间件。

嗨,当我使用passport.js进行OAuth时,即使我没有使用会话,我也得到了不使用的中间件。
EN

Stack Overflow用户
提问于 2021-05-08 08:41:06
回答 1查看 54关注 0票数 2

我是node.js的新手,目前正在从事我的第一个项目。当使用passport.js进行OAuth时,它给了我

代码语言:javascript
运行
复制
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)

错误,即使我目前没有使用会话。但是,当我注释掉‘my ()’函数时,它就不再显示这个错误了。据我所知,只有在使用会话时,我才必须使用'passport.initialize()‘。有人能帮帮我吗?

index.js :-

代码语言:javascript
运行
复制
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);

.:-

代码语言:javascript
运行
复制
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)
                  );
              }
            }
        );
    }
  )
);

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-08 09:27:31

在基于连接或快捷的应用程序中,需要使用

()中间件来初始化Passport。如果应用程序使用持久登录会话,则还必须使用passport.session()中间件。

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

passport.initialize()是您应该使用的中间件,用于初始化Passport。这就是你所犯的错误。

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

代码语言:javascript
运行
复制
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文件中指定如下所示。

代码语言:javascript
运行
复制
app.use(passport.initialize());
app.use(passport.session());

另外,将serializeUser & deserializeUser添加到护照设置( passport.js文件)中。

代码语言:javascript
运行
复制
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,因为这可能会导致混淆。而且,这也是一个很好的做法。

我希望这个答案对你有帮助。

谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67445623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档