0

Я изучаю javascript и node.js. Как вы знаете, одной из самых важных частей любого приложения для узлов является модуль входа в систему, поэтому я начал играть с паспортом и местным паспортом, но я не могу понять, как именно удостоверяется подлинность паспорта. Мое понимание процесса аутентификации паспорта ниже с кодом:Express4 и паспорт: Не удалось выполнить проверку подлинности

'use strict'; 

var express = require('express'); 
var app = express(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var dbConfig = require('./settings/db.js'); 
var mongoose = require('mongoose'); 
var expressSession = require('express-session'); 
var flash = require('connect-flash'); 

mongoose.connect(dbConfig.url); 

app.use(expressSession({ 
    secret: 'mySecretKey' 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); 

var server = app.listen(3000, function() { 
    var host = server.address().address; 
    var port = server.address().port; 

    console.log('Admin app started at: %s %s ', host, port); 
}); 

passport.serializeUser(function(user, done) { 
    console.log('serializing user!'); 
    done(null, 'Hi'); 
}); 

passport.deserializeUser(function(id, done) { 
    console.log('deserializing user'); 
    done(null, { 
    '_id': 'Hi', 
    'username': 'shankhs', 
    'password': 'admin' 
    }); 
}); 

var isAuthenticated = function(req, res, next) { 
    if (req.isAuthenticated()) { 
    console.log('Authenticated'); 
    console.log(req); 
    next(); 
    } 
    console.log('redirecting to /'); 
    console.log(req.isAuthenticated()); 
    res.redirect('/'); 
}; 

app.get('/', function(req, res, next) { 
    var fileOptions = { 
    root: __dirname, 
    dotfiles: 'deny', 
    headers: { 
     'x-timestamp': Date.now(), 
     'x-sent': true 
    } 
    }; 
    res.sendFile('login.html', fileOptions, function(err) { 
    if (err) { 
     console.log(err); 
     res.status(err.status).end(); 
    } else { 
     console.log('send login.html!' + Date.now()); 
    } 
    }); 
}); 

app.get('/admin', isAuthenticated, function(req, res, next) { 
    var fileOptions = { 
    root: __dirname, 
    headers: { 
     'x-timestamp': Date.now(), 
     'x-sent': true 
    } 
    }; 
    var fileName = 'index.html'; 
    res.sendFile(fileName, fileOptions, function(err) { 
    if (err) { 
     console.log(err); 
     res.status(err.status).end(); 
    } else { 
     console.log('Send index.html' + Date.now()); 
    } 
    }); 
}); 

passport.use('login', new LocalStrategy(
    function(req, username, password, done) { 
    console.log('using passport!'); 
    console.log(req.body.username); 
    console.log(req.body.password); 
    done(null, { 
     '_id': 'Hi', 
     'username': 'shankhs', 
     'password': 'admin' 
    }); 
    } 
)); 

app.post('/login', function(req, res) { 
    console.log(req.params); 
    passport.authenticate('login', { 
    successRedirect: '/admin', 
    failureRedirect: '/', 
    failureFlash: true 
    }) 
}); 
  1. запрос Публикация в/Логин маршрут вызывает асинхронной passport.authenticate вызов.
  2. Это passport.authenticate принимает «стратегию» в качестве аргумента
  3. Этой стратегия вызывается которая возвращает другой «Done» асинхронного вызова (в моем случае) не ошибки и пользовательского объект
  4. После «сделал» вызова , вызывается serializeUser и страница перенаправляется в/admin
  5. Если есть какой-либо последующий запрос или какой-либо URL-адрес, который имеет hasAuthenticated hook, passport.initialize проверяет, является ли объект req.passport.user пустым или нет.
  6. Если он пуст, процесс аутентификации снова повторяется.
  7. Если его нет, то passport.session называет passport.deserializeUser, который создает объект req.user

Моя проблема заключается в следующем:

  1. В 'Регистрационная' стратегии, эти три никогда не регистрировались:

    console.log ('с использованием паспорта!'); console.log (req.body.username); console.log (req.body.password);

Так значит ли это, что моя стратегия «входа» никогда не называется?

  1. Аналогично, console.logs в serializeUser и deserializeUser никогда не вызываются. Значит, эти функции также не вызываются?

Если мое понимание библиотеки паспортов верное, я пропускаю любую функцию для звонка?

Благодаря

ответ

2

Для будущих воинов:

Вот как паспорт должен работать. Подробное объяснение того, как работают паспортные работы, - here

То, что отсутствует здесь, является bodyparser в почтовом вызове/login. Вы можете подумать, что паспорт знает, как разбирать req.body! Неправильно! Это не так! Экспресс v 4 года тело-анализатор должен быть установлен independetly и используется как:

var bodyParser = require('body-parser'); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 

В запросе на сообщение:

app.post('/login', function(req, res, next) { 
    console.log('in login post!'); 
    console.log('body parsing: ' + req.body.username + ' ' + req.body.password); 
    passport.authenticate('login', function(err, user, info) { 
    if (err) { 
     console.log('passport err: ' + err); 
     return next(err); 
    } 
    if (!user) { 
     console.log('no user found!'); 
     return res.redirect('/'); 
    } 
    req.logIn(user, function(err) { 
     if (err) { 
     console.log('login error: ' + err); 
     return next(err); 
     } 
     return res.redirect('/admin'); 
    }); 
    })(req, res, next); 
}); 

Как вы можете видеть, что я написал функцию обратного вызова пользовательских Логин, что делает больше смысла и легко отлаживается, чем просто successRedirect и failRedirect.Без body-parser пользовательская функция не будет работать, потому что паспорт не знает, как разбирать req.body.

Апидограмма паспорта должна упоминать об этом! Ну, теперь, поскольку все работает по назначению, мир имеет смысл сейчас!

+0

is '(req, res, next)' в последней, но второй строке обязательно? Потому что я пишу локальную стратегию для своего приложения, и, похоже, она не работает без нее; однако, когда я его передаю, он работает! Раньше я работал с паспортом, и мне не нужно было проходить его, но не в этом! – Akash

+1

Да, это необходимо. Если я не ошибаюсь, это метод javascript для вызова анонимных методов. –

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