2016-12-04 3 views
1

Я пытаюсь внедрить логин через OAuth 2.0, однако я не могу сделать свои сеансы упорными, кажется, сразу после того, как пользователи прошли аутентификацию, их сеанс исчез. Кроме того, приложение, похоже, застревает в маршрутах/bnetauth.js при переадресации в функции обратного вызова.Сессии не постоянны [PASSPORT]

Эти файлы, в которых я использую паспорт

app.js

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
//TOOLS 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var session = require('express-session'); //Persistant sessions 
var passport = require('passport'); 
//REQUIRE MODELS 
require('./models/News'); 
require('./models/Application'); 
//REQUIRE ROUTES 
var bnetauth = require('./routes/bnetauth')(passport); 
var api = require('./routes/api'); 
var public = require('./routes/public'); 
var admin = require('./routes/admin'); 

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/karatechop'); 

require('./config/passport')(passport); 

var app = express(); 

app.use(express.static('views')); 
// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use(session({ 
    secret: 'ilovescotchscotchyscotchscotch', // session secret 
    resave: true, 
    saveUninitialized: true 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

//Use Routes 
app.use('/auth', bnetauth) 
app.use('/api', api); 
app.use('/admin', admin); 
app.use('/', public); 


// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
}); 

module.exports = app; 

маршруты/bnetauth.js (Logging через battle.net, отсюда и название bnetauth)

var express = require('express'); 
var router = express.Router(); 


module.exports = function(passport) { 

    router.get('/bnet', 
     passport.authenticate('bnet')); 

    router.get('/bnet/callback', 
     passport.authenticate('bnet', { 
      failureRedirect: '/' }), 
     function(req, res, next){ 
      console.log('Authenticated: ' + req.isAuthenticated()) 
      ####THIS IS WHERE IT GETS STUCK#### 
      res.redirect('https://localhost:3000/'); 
     }); 

config/passport.js

var BnetStrategy = require('passport-bnet').Strategy; 


var BNET_ID = 'hidden' 
var BNET_SECRET = 'hidden' 

var User = require('../models/user') 


// expose this function to our app using module.exports 
module.exports = function(passport) { 
    console.log('Entering passport') 
    // ========================================================================= 
    // passport session setup ================================================== 
    // ========================================================================= 
    // required for persistent login sessions 
    // passport needs ability to serialize and unserialize users out of session 

    // used to serialize the user for the session 
    passport.serializeUser(function(user, done) { 
     console.log('Serializing') 
     done(null, user.id); 
    }); 

    // used to deserialize the user 
    passport.deserializeUser(function(id, done) { 
     User.findById(id, function(err, user) { 
      console.log('Deserializing') 
      done(err, user); 
     }); 
    }); 

    passport.use(new BnetStrategy({ 
     clientID: BNET_ID, 
     clientSecret: BNET_SECRET, 
     region: 'eu', 
     callbackURL: "https://localhost:3000/auth/bnet/callback" 
    }, function(accessToken, refreshToken, profile, done) { 
     console.log(profile) 
     console.log(accessToken) 
     User.findOne({id: profile.id}, function(err, user){ 
      console.log("Trying!") 
      if(err) 
       return done(err); 

      if(user) { 
       return done(null, user); 
      } else { 
       var newUser = new User(); 

       newUser.id = profile.id, 
       newUser.token = accessToken, 
       newUser.battle_tag = profile.battletag 

       newUser.save(function(err) { 
        if (err) 
         throw err; 

        return done(null, newUser); 
       }); 
      } 
     }); 
    })); 
}; 

    return router; 
} 

ответ

0

Я нашел решение своей проблемы!

Проблема была в моих сериализации и десериализации функций в config/passport.js

На моей модели пользователя, у меня было две формы ид.

  1. _id применяется Монго
  2. идентификатора, который я сохраню от пользователей объекта передается обратно ко мне из battle.net (это идентификатор пользователя на battle.net).

В сериализации, идентификатор, который будет использоваться при сериализации пользователя к сессии, будет battle.net идентификатор (так как я звала user.id и не user._id

Затем в десериализации при извлечении данных от объекта пользователя, я использовал функцию findById Монго, которая использует ._id (который полностью отличается от .id в объекте моего пользователя, поэтому он вернулся 'undefined'.

Изменения .id к ._id в функции сериализации решить мой проблема и сеансы теперь работают и сохраняются.

Смежные вопросы