代码之家  ›  专栏  ›  技术社区  ›  KAT

Passport在每次请求时都会抛出500个内部服务器错误

  •  0
  • KAT  · 技术社区  · 6 年前

    我对此完全不知所措。我只能假设它是passport,因为当我注释掉它的初始化时,一切又神奇地工作了。我目前设置了2条路线。一个是要求用户登录的get请求,另一个是实际进行登录的post请求。

    在我的应用程序中。js文件我的passport设置如下所示:

    var sessionStore = new MySQLStore(options);
    
    //handles cookie/session creation
    app.set('trust proxy', 1) // trust first proxy
    app.use(session({
        secret: config.sessionKey,
        resave: false,
        store:sessionStore,
        saveUninitialized: false,
        cookie: {
            //secure: true,
            maxAge:24*60*60*1000 //1 day in milliseconds
        }
    }));
     app.use(passport.initialize());
     app.use(passport.session());
    require('./services/passport');
    
    //initiate route handlers
    app.use('/login', require('./routes/authRoutes'));
    app.use('/tiles', require('./routes/tileRoutes'));
    

    我使用的是本地策略,因为我的用户不会使用任何社交应用程序登录。我配置了另一个文件passport。js来实际处理passport设置。我使用sequelize数据库来验证用户。整个过程如下所示:

    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    const bcrypt = require('bcrypt');
    
    
    passport.serializeUser((user, done)=>{
        done(null, user.id);
    });
    
    passport.deserializeUser((user, done)=>{
        done(null, user.id);
    });
    passport.use(new LocalStrategy(function (username, password, done) {
        const db = require('../models');
        db.user.findOne({ where: {username: username} })
            .then((user)=>{
                if(!user){
                    return done(null, false);
                }else{
                    // if(user.dataValues.hashed_password === password)
                    //     return done(null, user);
                    bcrypt.compare(password, user.dataValues.hashed_password, function(err, res) {
                          if(res === true){
                              return done(null, user);
                          }else{
                              return done(null, err);
                          }
                    });
    
                }
            });
    
    }));
    

    注册用户、创建会话和存储会话id似乎都在发生,但当我开始使用axios在前端发出get/post请求(我使用的是react)时,我不断收到一个内部服务器错误。我试着在我能想到的任何地方捕捉到这个,在特定的点打破,一个控制台。正在注销,但我收到了相同的消息:

    [0] GET /tiles 500 8.049 ms - 2
    [0] GET /tiles 500 2.757 ms - 2
    

    或从控制台

    GET http://localhost:3000/tiles/ 500 (Internal Server Error)
    

    实际的get请求如下所示(在我知道它有效之前,我没有投入太多):

    const express = require('express');
    const router = express.Router();
    
    router.get('/', isLoggedIn, (req, res)=>{
        debugger;
        res.send({hi:'there'})
    });
    
    
    function isLoggedIn(req, res, next) {
        debugger;
            if (req.isAuthenticated()) return next();
            console.log('failure');
            res.redirect('/login')
    }
    
    module.exports=router;
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   nguyenkha    6 年前

    这个 deserializeUser 应在此处调用函数以按id查找用户,然后将其传递给done,第一个参数为 userId serializeUser 返回 user.id 到会话存储。示例:

    passport.deserializeUser((id, done)=>{
      passport.deserializeUser((id, done) => {
        User.findById(id).then((user) => {
          done(null, user);
        }).catch(done);
      });
    });