最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

ExpressJS会话身份验证与Passport和Mongoose投掷EPERM重命名错误

IT培训 admin 9浏览 0评论

ExpressJS会话身份验证与Passport和Mongoose投掷EPERM重命名错误

最近我经历了多年的PHP / MySQL网络开发后才进入MEAN-stack / general Nodejs,我正在研究身份验证。我使用this guide创建一个使用Passport和json-server的简单身份验证服务器。它完全按照该指南中的描述工作。

但是,我想在我正在学习的项目中使用mongoose / MongoDB,所以我决定尝试修改该指南中的代码以便为mongoose工作。

一切似乎都很顺利(如果没有与ExpressJS服务器上的会话相匹配的cookie并且登录功能有效,则无法命中'/ authrequired'端点)但我尝试添加注册功能并且我收到重命名错误我从来没有见过,在这种情况下找不到太多信息。

从mongoose的观点来看,注册代码工作得很好但是当我尝试调用req.login()时应该使用护照设置会话并重定向到'/ authrequired'(这是一个需要会话的守卫区域),我被踢回' /'(当'/ authrequired'无法验证用户身份时会发生这种情况)。

我得到的错误是:

错误:EPERM:不允许操作,重命名为'C:\ Users \ admin \ express-auth \ server \ sessions \ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133' - >'C:\ Users \ admin \ express -auth \服务器\会话\ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json”

我不明白为什么express试图首先重命名会话文件。如果我查看sessions文件夹中有2个文件:

  • 39cad5de-5e1b-4319-b967-c77dd3ef729d.json
  • 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133

第一个是json会话数据,第二个是空白。

有谁知道发生了什么?我做错了什么,我该怎么做才能解决这个问题?

我没有使用链接指南中描述的json-server / axios版本获得此重命名错误。

谢谢

护照配置

passport.use(new LocalStrategy(
  { usernameField: 'email' },
  (email, password, done) => {
    User.findOne({email: email}, (err, user) => {
      if(!user) {
        return done(null, false, { message: 'Invalid credentials.\n' });
      }
      if(!bcryptpareSync(password, user.password)) {
        return done(null, false, { message: 'Invalid credentials.\n' });
      }
      return done(null, user);
    });
  }
});

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

passport.deserializeUser((id, done) => {
  User.findById(id, (err, user) => {
    if(user) {
      done(null, user);
    }
    else if(err) {
      done(error, false);
    }
  });
});

应用设置

// create the server
const app = express();

// add & configure middleware
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());

注册端点

app.post('/register', (req, res, next) => { 
  User.findOne({email: req.body.email}, (err, user) => {
    if(user) {
      res.send('Account with email already exists.');
    } else {
      console.log(req.body.password);
      bcrypt.hash(req.body.password, null, null, (err, hash) => {
        if(err) { return next(err); }
        var newUser = new User({
          username: req.body.username,
          email: req.body.email,
          password: hash,
          passwordConf: hash
        });
        newUser.save((err, savedUser) => {
          console.log(savedUser);
          if(err) {
            return res.send('error saving user.');
          }
          else {
            req.login(savedUser, (err) => {
              if(err) { return next(err); }
              return res.redirect('/authrequired');
            });
          }
        });
      });
    }
  });
});

登录端点

    app.post('/login', (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    if(info) {return res.send(info.message)}
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.login(user, (err) => {
      if (err) { return next(err); }
      return res.redirect('/authrequired');
    });
  })(req, res, next);
});

已获得的端点

app.get('/authrequired', (req, res) => {
  if(req.isAuthenticated()) {
    res.send('you hit the authentication endpoint\n')
  } else {
    res.redirect('/')
  }
});
回答如下:

我面临着类似的问题。我意识到我们俩都有两次会话。

app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());

删除第一个会话声明时,错误消失了。

app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))

ExpressJS会话身份验证与Passport和Mongoose投掷EPERM重命名错误

最近我经历了多年的PHP / MySQL网络开发后才进入MEAN-stack / general Nodejs,我正在研究身份验证。我使用this guide创建一个使用Passport和json-server的简单身份验证服务器。它完全按照该指南中的描述工作。

但是,我想在我正在学习的项目中使用mongoose / MongoDB,所以我决定尝试修改该指南中的代码以便为mongoose工作。

一切似乎都很顺利(如果没有与ExpressJS服务器上的会话相匹配的cookie并且登录功能有效,则无法命中'/ authrequired'端点)但我尝试添加注册功能并且我收到重命名错误我从来没有见过,在这种情况下找不到太多信息。

从mongoose的观点来看,注册代码工作得很好但是当我尝试调用req.login()时应该使用护照设置会话并重定向到'/ authrequired'(这是一个需要会话的守卫区域),我被踢回' /'(当'/ authrequired'无法验证用户身份时会发生这种情况)。

我得到的错误是:

错误:EPERM:不允许操作,重命名为'C:\ Users \ admin \ express-auth \ server \ sessions \ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133' - >'C:\ Users \ admin \ express -auth \服务器\会话\ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json”

我不明白为什么express试图首先重命名会话文件。如果我查看sessions文件夹中有2个文件:

  • 39cad5de-5e1b-4319-b967-c77dd3ef729d.json
  • 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133

第一个是json会话数据,第二个是空白。

有谁知道发生了什么?我做错了什么,我该怎么做才能解决这个问题?

我没有使用链接指南中描述的json-server / axios版本获得此重命名错误。

谢谢

护照配置

passport.use(new LocalStrategy(
  { usernameField: 'email' },
  (email, password, done) => {
    User.findOne({email: email}, (err, user) => {
      if(!user) {
        return done(null, false, { message: 'Invalid credentials.\n' });
      }
      if(!bcryptpareSync(password, user.password)) {
        return done(null, false, { message: 'Invalid credentials.\n' });
      }
      return done(null, user);
    });
  }
});

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

passport.deserializeUser((id, done) => {
  User.findById(id, (err, user) => {
    if(user) {
      done(null, user);
    }
    else if(err) {
      done(error, false);
    }
  });
});

应用设置

// create the server
const app = express();

// add & configure middleware
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());

注册端点

app.post('/register', (req, res, next) => { 
  User.findOne({email: req.body.email}, (err, user) => {
    if(user) {
      res.send('Account with email already exists.');
    } else {
      console.log(req.body.password);
      bcrypt.hash(req.body.password, null, null, (err, hash) => {
        if(err) { return next(err); }
        var newUser = new User({
          username: req.body.username,
          email: req.body.email,
          password: hash,
          passwordConf: hash
        });
        newUser.save((err, savedUser) => {
          console.log(savedUser);
          if(err) {
            return res.send('error saving user.');
          }
          else {
            req.login(savedUser, (err) => {
              if(err) { return next(err); }
              return res.redirect('/authrequired');
            });
          }
        });
      });
    }
  });
});

登录端点

    app.post('/login', (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    if(info) {return res.send(info.message)}
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.login(user, (err) => {
      if (err) { return next(err); }
      return res.redirect('/authrequired');
    });
  })(req, res, next);
});

已获得的端点

app.get('/authrequired', (req, res) => {
  if(req.isAuthenticated()) {
    res.send('you hit the authentication endpoint\n')
  } else {
    res.redirect('/')
  }
});
回答如下:

我面临着类似的问题。我意识到我们俩都有两次会话。

app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());

删除第一个会话声明时,错误消失了。

app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
发布评论

评论列表 (0)

  1. 暂无评论