Отсутствуют учетные данные для регистрации / входа по паспорту

#node.js #passport.js #passport-local

#node.js #passport.js #паспорт-локальный

Вопрос:

У меня есть приложение nodejs, использующее passport для аутентификации.

В настоящее время у меня возникла проблема с моей регистрацией / входом в систему (я просто покажу проблему с регистрацией, поскольку у этих двоих одна и та же проблема). Когда я попытался отправить сообщение с помощью «email», «password», «fullname», в консоли регистрируется, что

 info { message: 'Missing credentials' }
  

Код, который запускает это сообщение, находится в auth.js ниже.

Не мог бы кто-нибудь, пожалуйста, предложить способ решить эту проблему? Кроме того, побочный вопрос: как я могу получить идентификатор текущего пользователя в сеансе? Должен ли это быть req.user или req.session.passport.user

Вот моя структура приложения

 ├── config
│   ├── config.json
│   └── passport.js
├── models
│   ├── index.js
│   └── user.js
├── query.js
├── routes
│   ├── auth.js
└── server.js
  

server.js

 const express = require("express");
const bodyParser = require("body-parser");
const cors = require('cors');
const passport     = require('passport');
const flash        = require('connect-flash');
const cookieParser = require('cookie-parser');
const session      = require('express-session');

const app = express();
const port = process.env.port || 8080;

app.use(cors());
app.use(express.json());
app.use(bodyParser.urlencoded( {extended: false} ));
app.use(bodyParser.json());// pass the body as json

app.use(session({
  secret: 'goN6DJJC6E287cC77kkdYuNuAyWnz7Q3iZj8',
  resave: false,
  saveUninitialized: false,
  cookie: {
    expires: 600000
  }
}));

// PASSPORT: for passport authentication
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions

// FLASH: for error messages
app.use(flash());

// ROUTES:
require('./routes/auth')(app, passport);
app.listen(port, () => { 
  console.log(`Server is running on port ${port}`) 
});
  

passport.js (красивый исходный код из https://github.com/b0bbybaldi/Rent-All/blob/master/config/passport.js ). Спасибо b0bbybaldi :)))))

 var LocalStrategy = require('passport-local').Strategy;

var db  = require('../models');


module.exports = function(passport) {
    

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

    // deserialize
    passport.deserializeUser(function(id, done) {
        db.User.findById(id).then(function(user) {
            if (user) {
                done(null, user.get());
            } else {
                done(user.errors, null);
            }
        });
    });

    passport.use('local-signup', new LocalStrategy(
        {
            // by default, local strategy uses username and password, we will override with email
            usernameField: 'email',
            passwordField : 'password',
            passReqToCallback : true // allows us to pass back the entire request to the callback
        },
        function(req, email, password, done) {
            process.nextTick(function() {
                db.User.findOne({
                    where: {
                        email: req.body.email
                    }
                }).then(function(user, err){
                    if(err) {
                        console.log("err",err)
                        return done(err);
                    }
                    // check to see if theres already a user with that email
                    if (user) {
                        console.log('signupMessage', 'That email is already taken.');
                        return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                    } else {
                        // console.log("creating");

                        db.User.create({
                            email: req.body.email,
                            fullname:req.body.fullname,
                            password: db.User.generateHash(req.body.password)

                        }).then(function(dbUser) {
                            //console.log("created result: ", dbUser);
                            // send post back to render
                            console.log("User Created")
                            return done(null, dbUser);

                        }).catch(function (err) {
                            // handle error;
                            console.log(err);
                        });
                    }
                });
            });

        }));
}
  

auth.js

 var db = require("../models");

module.exports = function (app, passport) {
    app.post('/signup', function(req, res, next) {
        passport.authenticate('local-signup', function(err, user, info) {
            console.log("info", info);
            if (err) {
                console.log("passport err", err);
                return next(err); // will generate a 500 error
            }
            // Generate a JSON response reflecting authentication status
            if (! user) {
                console.log("user error", user);
                return res.send({ success : false, message : 'authentication failed' });
            }

            req.login(user, loginErr => {
                if (loginErr) {
                    console.log("loginerr", loginErr)
                    return next(loginErr);
                }
                //var userId = user.dataValues.id;
                console.log('redirecting....');

                res.cookie('user_id', user.id);
                res.cookie('user_name', user.fullname );
                //return res.json("/accounts/view");
                console.log("Registered")
            });
        })(req, res, next);
    });

}
  

Комментарии:

1. Я не гуру или эксперт в области js, узлов или узлов, но разве вам не нужны расширения файлов в ваших заявлениях require? или это все еще нормально загружает ресурсы? просто спрашиваю из любопытства…

2. также почему db.User.findOne использует Capitol, но везде он строчный?

3. @RyanStone Привет, Райан, о расширениях файлов, не могли бы вы подробнее рассказать? Я думаю, что код между файлами может взаимодействовать должным образом. Для db.User.findOne и «user» давайте подумаем так: в моей папке models, которую я импортировал как db в данном случае, был экспортированный модуль с именем User; я использовал findOne в качестве метода этого модуля. «Пользователь», заключенный в функцию then, был просто переменной, которая извлекала результат из функции findOne. Это имеет смысл для вас?

4. Конечно… Я знаю, что когда вам требуются встроенные модули узла, им не требуется расширение или абсолютный путь, но в вашей части, где говорится: «var db = require («.. / models»)» Не уверен, было ли это целенаправленно моделями или модулями, но если этофайл, который вы создали, я думаю, ему нужен полный путь models.js, models.php, models.html, models.jsx , т. Е. И т.д…. Если он не выдает ошибку, то это может быть не проблема, я просто просматривал ваш код, пытаясь лучше его понять..

5. Привет, Райан, извините за мой поздний ответ. в данном случае «модели» — это папка, содержащая модули внутри. Однако, даже если это модули, я все равно могу ссылаться на него без .js tail