passport.authenticate () не является функцией в отдельных маршрутах

0

Я сделал и посмотрел на несколько примеров Passport JS. К сожалению, никто из них, как мой. Он работает по назначению, когда я получаю паспорт в файле server.js как в коде, который я копировал.

Но мне не удалось получить паспорт.authenticate() для работы в src/server/login/routes.js

Я также не могу заставить его работать как POST, он работает только как GET, и я не знаю почему.

server.js

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var expressSession = require('express-session');
var passport = require('passport');
var passportLocal = require('passport-local');
var User = require('server/db/db').User;
var routes = require('server/routes');

var PORT = process.env.PORT || 3000;

app.use(bodyParser.json());
app.use(cookieParser());
app.use(expressSession({
  secret: process.env.SESSION_SECRET || 'mySecret',
  resave: true,
  saveUninitialized: false
}));

app.use(passport.initialize());
app.use(passport.session());

passport.use(new passportLocal.Strategy(function(username, password, done) {
  console.log('localStrat Username: ' + username + ' Password: ' + password);
  User.findOne({username: username, password: password}, function(err, user) {
    console.log('searched for user');
    if(user) {
      console.log('found');
      console.log(user);
      done(null, user);  
    } else {
      console.log('none');
      done(null, false, {message: 'Unable to login'});  
    }  
  });
  // if(username === password) {
  //   done(null, {id: username, name: username});  
  // } else {
  //   done(null, false, {message: 'Unable to login'});  
  // }
}));

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

passport.deserializeUser(function(id, done) {
  done(null, {id: id, name: id});
});

routes(app);

app.get('/', function(req, res) {
  res.send('\
    <!DOCTYPE html>\
    <html>\
      <head>\
        <title>TCG Inventory Manager</title>\
        <base href="/">\
      </head>\
      <body>\
        <div ui-view></div>\
        <script src="bundle.js"></script>\
      </body>\
    </htm>\
  ');
});

app.get('/login', passport.authenticate('local'), function(req, res) {
  console.log('/login');
  res.send(req.user);
});

SRC/конфигурации /config.js

import angular from 'angular';
import uiRouter from 'angular-ui-router';
import uiBootstrap from 'angular-ui-bootstrap';
import todoFactory from 'factories/todo-factory';
import invManFactory from 'factories/invMan-factory';
import loginFactory from 'factories/login-factory';
import todosController from 'todos/todos';
import invController from 'invMan/invMan';
import loginController from 'login/login';

const app = angular.module('app', [uiRouter, todoFactory.name, invManFactory.name, loginFactory.name, uiBootstrap]);

app.config(($stateProvider, $urlRouterProvider, $locationProvider) => {
  $urlRouterProvider.otherwise('/');

  $stateProvider
    .state('todos', {
      url: '/todo',
      template: require('todos/todos.html'),
      controller: todosController
    })
    .state('about', {
      url: '/about',
      template: require('about/about.html')
    })
    .state('invMan', {
      url: '/invMan',
      template: require('invMan/invMan.html'),
      controller: invController,
      resolve: { loginCheck: checkLogin }
    })
    .state('login', {
      url: '/',
      template: require('login/login.html'),
      controller: loginController
    })

    $locationProvider.html5Mode(true);
});

var checkLogin = function($q, $timeout, $http, $location, $rootScope) {
  console.log('checkLogin');
  var deffered = $q.defer();

  $http.get('/login/stuff/loggedIn').success(function(user) {
    $rootScope.errorMessage = null;
    // User is Authenticated
    if(user !== '0') {
      console.log('is authed');
      $rootScope.currentUser = user;
      deffered.resolve();
    // User is not Authenticated
    } else {
      console.log('not authed');
      $rootScope.errorMessage = 'You need to be log in.';
      deffered.reject();
      $location.url('/');
    }
  });
  return deffered.promise;
};

export default app;

ЦСИ/сервер/routes.js

var loginRoutes = require('server/login/routes');
var todosRoutes = require('server/todos/routes');
var invManRoutes = require('server/invMan/routes');

module.exports = function routes(app, passport) {
  app.use('/todos', todosRoutes);
  app.use('/invMan', invManRoutes);
  app.use('/login/stuff', loginRoutes);
};

SRC/сервер/Логин /routes.js

var express = require('express');
var mongoose = require('mongoose');
var User = require('server/db/db').User;
var router = express.Router();

router.get('/', passport.authenticate('local'), function(req, res) {
    console.log('login');
    res.send(req.body);
});

router.get('/loggedIn', function(req, res) {
    res.send(req.isAuthenticated() ? req.user : '0');
});

module.exports = router;

Заранее спасибо за помощь!

Теги:
passport.js
passport-local

1 ответ

0

Вы можете передавать эту функцию, когда вам нужно проверить подлинность.

router.get('/', ensureAuthentication, function(req, res) {
console.log('login');
res.send(req.body);
});

function ensureAuthentication(req, res, next) {
  if (req.isAuthenticated()) {
     return next();
     } else {
    //user is not logged in
  }
}
  • 0
    Спасибо, но это не то, что я ищу. Я видел этот код раньше, и если я правильно его понял, он будет работать только после успешного выполнения passport.authenticate (). Это лучшая версия моей функции checkLogin в src/config/config.js я прав?
  • 0
    При первом входе пользователя в систему необходимо использовать passport.authenticate ('local', {successRedirect: '/', faultRedirect: '/ users / login', faultFlash: true}); После входа в систему вы можете использовать req.authenticate (), чтобы проверить, вошел ли пользователь в систему.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню