Я создаю систему аутентификации для Node.js, используя локальную стратегию Passport.Я сохраняю все пользовательские данные в БД SQL Server Express, вместо обычной MongoDB, которую я вижу почти во всех примерах реализации Passport.До сих пор мне удалось создать работающий интерфейс регистрации пользователей, который сохраняет имя пользователя и хэш, а также имя и фамилию пользователя.Я немного сомневался в деталях, касающихся определения функции обратного вызова passport.authenticate, только чтобы обнаружить, что она даже не запускалась (текст обратного вызова Passport.authenticate был запущен. Никогда не регистрировался на консоли)!Я обязательно установил паспорт.passport-local, express и express-session с npm.Что мне не хватает?(код ниже) Большое спасибо
Точка входа в узел ("app.js"):
// Import dependencies:
const express = require('express')
const fs = require('fs')
const sql = require('mssql')
const bcrypt = require('bcrypt')
const passport = require('passport')
const session = require('express-session')
const LocalStrategy = require('passport-local').Strategy
// Get port fron environment variables. If not found, default to http standard value:
const port = process.env.PORT || 80
// Create Express app:
const app = new express()
// Express body parser
app.use(express.urlencoded({
extended: true
}))
// Express session
app.use(
session({
secret: 'secret',
resave: true,
saveUninitialized: true
})
)
// Passport middleware
app.use(passport.initialize())
app.use(passport.session())
passport.use(
new LocalStrategy({
usernameField: 'userName'
}, (username, password, done) => {
console.log('Passport.authenticate callback was launched.')
var getUserPassword = require('./api/getUserPassword')
getUserPassword({
username: username
}, (queryOutput) => {
if (err) {
console.log(err)
return done(err, false)
}
// Match user
console.log('Query output: ' + queryOutput)
if (!queryOutput[0].Password) {
return done(null, false)
}
// Match password
bcrypt.compare(password, queryOutput[0].Password, (err, isMatch) => {
if (err) throw err
if (isMatch) {
return done(null, {
user: userName,
password: queryOutput[0].Password
})
} else {
return done(null, false)
}
})
})
})
)
passport.serializeUser(function (user, done) {
console.log("User id: " + user.id)
done(null, user.id)
})
passport.deserializeUser(function (id, done) {
done(err, user)
})
// Define static files directory:
app.use('/interfaces', express.static('public'))
app.post('/login', (req, res, next) => {
console.log("req.user = " + req.user)
passport.authenticate('local')(req, res, next)
})
// Check if authenticated:
app.get('*', (req, res, next) => {
if (!req.isAuthenticated()) {
res.redirect('/interfaces/Login/index.html')
}
return next()
}
})
app.post('*', (req, res) => {
console.log("Received post request for path: " + req.path)
console.log("Request body: " + JSON.stringify(req.body))
if (req.path.startsWith("/api")) {
if (!req.isAuthenticated() && req.path != '/login') {
console.log("Attempt to call web service without previous authentication detected.")
res.send('{OUT_Result:"failure"}')
return
}
var apiFunction = require("." + req.path)
apiFunction(req.body, (OUT_Result) => {
console.log("OUT_Result = " + OUT_Result)
res.send(OUT_Result)
})
}
})
// Launch server:
app.listen(port, () => {
console.log('Listening on port ' + port)
})