Я изучаю 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
})
});
- запрос Публикация в/Логин маршрут вызывает асинхронной passport.authenticate вызов.
- Это passport.authenticate принимает «стратегию» в качестве аргумента
- Этой стратегия вызывается которая возвращает другой «Done» асинхронного вызова (в моем случае) не ошибки и пользовательского объект
- После «сделал» вызова , вызывается serializeUser и страница перенаправляется в/admin
- Если есть какой-либо последующий запрос или какой-либо URL-адрес, который имеет hasAuthenticated hook, passport.initialize проверяет, является ли объект req.passport.user пустым или нет.
- Если он пуст, процесс аутентификации снова повторяется.
- Если его нет, то passport.session называет passport.deserializeUser, который создает объект req.user
Моя проблема заключается в следующем:
В 'Регистрационная' стратегии, эти три никогда не регистрировались:
console.log ('с использованием паспорта!'); console.log (req.body.username); console.log (req.body.password);
Так значит ли это, что моя стратегия «входа» никогда не называется?
- Аналогично, console.logs в serializeUser и deserializeUser никогда не вызываются. Значит, эти функции также не вызываются?
Если мое понимание библиотеки паспортов верное, я пропускаю любую функцию для звонка?
Благодаря
is '(req, res, next)' в последней, но второй строке обязательно? Потому что я пишу локальную стратегию для своего приложения, и, похоже, она не работает без нее; однако, когда я его передаю, он работает! Раньше я работал с паспортом, и мне не нужно было проходить его, но не в этом! – Akash
Да, это необходимо. Если я не ошибаюсь, это метод javascript для вызова анонимных методов. –