Я начинающий новичок, который пытается встать и запустить, следуя некоторым учебникам и примерам. Я хочу создать JSON API, который позволяет локально, facebook, твиттер и google войти, поэтому я использую passport.js. В настоящее время я пытаюсь объединить https://github.com/vitaly-t/pg-promise-demo с http://blog.slatepeak.com/refactoring-a-basic-authenticated-api-with-node-express-and-mongo/ (извините, что код такой несоответствующий беспорядок стилей), и я столкнулся с проблемой, когда мой журнал POST возвращает: Can not Post/auth/login/local, когда я предоставляю правильные учетные данные, он отлично работает, если мои учетные данные плохие, я действительно не понимаю, почему поведение будет отличаться, если только паспорт-локальный не делает что-то в фоновом режиме, которое я не принимаю во внимание. Файлы, которые я считаю важными являются:Node Express pg-prom Паспортно-локальный JWT не может отправлять
SERVER.js
'use strict';
var db = require('./db/db.js').db
, express = require('express')
, auth = require('./routes/auth')
, router = express.Router()
, app = express()
, routes = require('./routes/routes.js')
, bodyParser = require('body-parser') //must be before passport
, config = require('./conf/main');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use('/auth', auth);
// Enable CORS from client-side - Will I need this?
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, Access-Control-Allow-Credentials");
res.header("Access-Control-Allow-Credentials", "true");
next();
});
//////////////////////////////////////////////
// Users Web API
//////////////////////////////////////////////
app.post('/users/local', routes.userAddLocal);
app.get('/users', routes.getAllUsers); //This should go into the Admin App. Will they both be able to use Postgres at once?
app.listen(config.port,() => {
console.log('\nReady for requests on http://localhost:' + config.port);
});
AUTH.js
'use strict';
///////////////////////// Passport Setup
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy
, JwtStrategy = require('passport-jwt').Strategy
, ExtractJwt = require('passport-jwt').ExtractJwt
, jwt = require('jsonwebtoken')
, db = require('../db/db.js').db
, config = require('../conf/main')
, express = require('express')
, bodyParser = require('body-parser') //must be before passport
, bcrypt = require('bcrypt-nodejs');
const jwtOptions = {
// Telling Passport to check authorization headers for JWT
jwtFromRequest: ExtractJwt.fromAuthHeader(),
// Telling Passport where to find the secret
secretOrKey: config.secret
};
passport.use('local', new LocalStrategy({
usernameField: 'email'
, passReqToCallback: false
, session: false //Turn off sessions, this is a stateless REST service using JWT
},
function(username, password, done) {
db.users.findByEmail(username)
.then(function (user){
if (!user) { return done(null, false); }
var pwMatch = bcrypt.compareSync(password, user.password);
if (!pwMatch) { return done(null, false); }
return done(null, user);
})
.catch(function(error){
return done(error);
})
}
));
passport.use('jwt', new JwtStrategy(jwtOptions, function(payload, done) {
console.log("jwt strategy top line");
db.users.findById(payload._id) //maybe need payload.doc._id or payload.document._id
.then(function (user){
if (user) {
done(null, user);
} else {
done(null, false);
}
})
.catch(function(error){
return done(err, false);
})
}));
function generateToken(user) {
return jwt.sign(user, config.secret, {
expiresIn: 10080 // in seconds
});
};
var authRoutes = express.Router();
authRoutes.use(bodyParser.urlencoded({ extended: true }));
authRoutes.use(bodyParser.json());
authRoutes.use(passport.initialize());
authRoutes.post('/login/local', passport.authenticate('local', {
function(req, res) {
var tokenObj = auth.generateToken({email: req.body.email, displayName: req.body.DisplayName});
res.status(201).json({
token: 'JWT ' + tokenObj,
user: req.body.displayName
});
},
failureRedirect: '/auth/notauth',
session: false
}));
authRoutes.get('/notauth', function (req, res){
res.status(401).send("Login Failed");
});
module.exports = authRoutes;
module.exports.generateToken = generateToken;
Любая помощь, кто мог бы предложить были бы оценены.
Редактировать # 1: Я попробовал переписать маршрут для PORT ('login/local'), и теперь он входит в систему, но по какой-то причине у меня нет доступных req и req.user объектов. Все, что я говорю, говорит, что мне нужно включать сеансы, но я не использую сеансы, так что это не подходит для меня. Вот новый маршрут:
authRoutes.post('/login/local', passport.authenticate('local',
function(req, res){
console.log("authentication successful");
var tokenObj = generateToken({email: req.body.email, displayName: req.body.DisplayName});
res.status(201).json({
token: 'JWT ' + tokenObj,
user: req.body.displayName
});
}
, {failureRedirect: '/auth/notauth'}
, {session: false}
));
Может кто-нибудь сказать мне, как это исправить, так что req.user будет доступно в соответствии с документацией Passport?
Редактировать # 2: Кажется, что функция успеха получает нуль и объект, который содержит запись db из таблицы users. Кажется, именно то, что я верну, когда пользователь успешно войдет в систему. Как-то я сломал Passport-Local, и это не так.