2015-10-04 2 views
0

Я ноб в NodeJS, и у меня есть некоторые проблемы с Authenticate Passport.паспорт всегда возвращает 401, даже он уже вошел в систему, как localStrategy, так и googleStrategy

Прежде всего, я должен сказать, что я искал и повторил попытку аутентификации на обоих сайтах google и stackoverflow около 2 недель, и я не могу решить эту проблему, поэтому благодарим вас за каждый ответ.

Мое приложение на основе стека MEAN с помощью Express.js и Passport для авторизации. И нам нужно авторизоваться в каком-то разделе, и мы разрешили Локальный логин и Google Войти.

После того как я пытался до сих пор, я решить проблему и проблему о санкционировать и последнее, что я не могу понять

Каждый Авторизоваться успех всегда возвращаются 401 на обоих LocalStrategy и GoogleStrategy

И это это мой код.

App

app.use(require('morgan')('dev')); //combined 
app.use(require('cookie-parser')()); 
app.use(require('body-parser').urlencoded({ extended: true })); 
app.use(require('body-parser').json()); 
app.use(require('method-override')('_method')); 
app.use(require('express-session')({ secret: config.sessionKey, resave: false, saveUninitialized: false, cookie: { secure: true } })); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use('/', require('./app/config/route')); 

Паспорт

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; 
var config = require('./config'); 
var User = require('../models/user'); 


passport.use('local-signup', new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password', 
     passReqToCallback: true 
    }, 
    function(req, email, password, done) { 
     process.nextTick(function() { 
      User.findOne({'email': email}, function(err, user) { 
       if (err) { 
        mgHooks.sendError(err); 
        return done(err); 
       } 
       if (user) { 
        return done(null, {status: config.statusText.NotOk, message: config.talkback.usedEmail}); 
       } else { 
        var newUser = new User(); 
        newUser.email = email; 
        newUser.name = req.body.name; 
        newUser.secret = md5(email); 
        newUser.password = newUser.generateHash(password); 
        newUser.save(function(err) { 
         if (err) { 
          mgHooks.sendError(err) 
          throw err; 
         } 
         return done(null, { 
          status: config.statusText.Ok, 
          message: config.talkback.signupSuccess, 
          user: newUser.id 
         }); 
        }); 
       } 
      }); 
     }); 
    }) 
); 

passport.use('local-login', new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password', 
     passReqToCallback: true 
    }, 
    function(req, email, password, done) { 
     User.findOne({'email': email}, function(err, user) { 
      if (err) { 
       mgHooks.sendError(err); 
       return done(err); 
      } 
      if (!user){ 
       return done(null, {status: config.statusText.NotOk, message: config.talkback.invalidLogin}); 
      } 
      if (!user.validPassword(password)){ 
       return done(null, {status: config.statusText.NotOk, message: config.talkback.invalidLogin}); 
      } 
      //Valid, then login 
      var now = new Date(); 
      user.lastVisited = now; 
      user.save(); 
      return done(null, { 
       status: config.statusText.Ok, 
       message: config.talkback.signupSuccess, 
       user: user.id 
      }); 
     }); 

    })); 

passport.use(new GoogleStrategy({ 
     clientID: config.google.GOOGLE_CLIENT_ID, 
     clientSecret: config.google.GOOGLE_CLIENT_SECRET, 
     callbackURL: config.google.CALLBACK_URL 
    }, 
    function(accessToken, refreshToken, profile, done) { 
     User.findOrCreate({provider: profile.provider, uid: profile.id}, function (err, user) { 
      var updateUser = { 
       name: profile.displayName, 
       photo: profile.photos[0].value , 
       email: profile.emails[0].value, 
       _raw: profile._raw 
      }; 
      User.findOneAndUpdate({provider: profile.provider, uid: profile.id}, updateUser, function(err, doc){ 
       if (err) { 
        console.log(err); 
        mgHooks.sendError(err); 
       } 
       return done(err, user); 
      }); 
     }); 
    } 
)); 
passport.serializeUser(function(user, done) { 
     done(null, user); 
}); 
passport.deserializeUser(function(user, done) { 
     done(null, user); 
}); 

Маршрут

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

//Authorize function 
var auth = function(req, res, next){ 
    if (!req.isAuthenticated()) 
     res.send(401); 
    else 
     next(); 
}; 

router.get('/', function(req, res, next) { 
    res.render('index'); 
}); 

router.use('/api/auth', auth, require('../controllers/api')); 

router.get('/auth/loggedin', function(req, res) { 
    res.send(req.isAuthenticated() ? req.user : 'unauthorized'); 
}); 

router.post('/auth/signup', passport.authenticate('local-signup'), function(req, res){ 
    res.send(req.user); 
}); 

router.post('/auth/login', passport.authenticate('local-login'), function(req, res) { 
    res.send(req.user); 
}); 
router.post('/auth/logout', function(req, res){ 
    req.logOut(); 
    res.send(200); 
}); 
router.get('/auth/google', 
    passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/plus.login', 'https://www.googleapis.com/auth/plus.profile.emails.read'] }) 
    ); 
router.get('/auth/google/callback', 
    passport.authenticate('google', { failureRedirect: '/#!/login' }), 
    function(req, res) { 
     // Successful authentication, redirect home. 
     res.redirect('/#!/profile'); 
    }); 

Сначала я думаю, что это из-за того, промежуточного ПО, но я старался с каждым учебником, который я нашел, и это не работает.

Пожалуйста, помогите мне разобраться в этом. Большое спасибо!

ответ

0

Обновление, я просто нашел пример, который пишет промежуточное программное обеспечение сообщения с сохранением сеанса, и оно работает сейчас!

app.use(function(req, res, next){ 
    var err = req.session.error, 
    msg = req.session.notice, 
    success = req.session.success; 

    delete req.session.error; 
    delete req.session.success; 
    delete req.session.notice; 

    if (err) res.locals.error = err; 
    if (msg) res.locals.notice = msg; 
    if (success) res.locals.success = success; 

    next(); 
}); 
Смежные вопросы