Passport.js - аутентифицированный пользователь, проверяя только имя пользователя

Я пытаюсь аутентифицировать пользователя, используя только его имя пользователя, которое хранится в базе данных PostGreSQL. В данный момент он возвращает сообщение об ошибке "отсутствуют учетные данные". Я предполагаю, что мне может понадобиться пароль, которого у меня нет и который я не хочу использовать. Я изучаю passport.js, потому что в конце концов захочу включить единый вход. Я следил за документацией и настраивал по мере необходимости. Я ввожу имя пользователя, хранящееся в базе данных, но оно мне не нравится. Есть причины почему? Я могу предоставить ссылку на мой GitHub, если это необходимо.

user.js

const router = require('express').Router();
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const Staff = require('../models/Staff');

module.exports = router;

router.get('/login', function (req, res) {
    res.render('login');
});

passport.use(new LocalStrategy(
    function (username, password, done) {
        Staff.findOne({
            username: username
        }, function (err, user) {
            if (err) {
                return done(err);
            }
            if (!user) {
                return done(null, false, {
                    message: 'Incorrect username.'
                });
            }
            return done(null, user);
        });
    }
));

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

passport.deserializeUser(function (id, done) {
    Staff.findById(id, function (err, user) {
        done(err, user);
    });
});

router.post('/login/post',
    passport.authenticate('local', {
        successRedirect: '/',
        failureRedirect: '/login',
        failureFlash: true
    })
);

staff.js - модель

const Sequelize = require('sequelize');
const db = require('../db');

// Staff table
const Staff = db.define('staff', {
    userName: {
        type: Sequelize.STRING
    },
    firstName: {
        type: Sequelize.STRING
    },
    lastName: {
        type: Sequelize.STRING
    },
    email: {
        type: Sequelize.STRING
    }
});


module.exports = Staff;

index.js

const router = require('express').Router();

const Staff = require('../models/Staff');
const Course = require('../models/Course');
const Occurrence = require('../models/Occurrence');
const Moderation = require('../models/Moderation');

module.exports = router;

// Index
router.get('/', ensureAuthenticated, function (req, res) {
    Staff.findOne({
        where: {
            userName: userName
        },
        include: [{
            model: Occurrence,
            include: [Course]
        }]
    }).then(staff => {
        Moderation.findAll({
            where: {
                doneById: staff.id,
                status: 'submitted'
            },
            include: [{
                model: Staff,
                as: 'doneFor'
            }]
        }).then(forMe => {
            res.render('index', {
                staff,
                forMe
            });
        });
    });
});

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    } else {
        req.flash('danger', 'You are currently not logged in.');
        res.redirect('/login');
    }
}

login.pug

body.bg-dark
    .container
        .login-content
            .login-logo
                h1#login-header Course Manager Admin
            .login-form  
                form(action='/login/post', method='POST')
                    != messages('message', locals) 
                    .form-group
                        label.control-label.mb-1(for='username') Username *
                        input#userName.form-control(name='username', type='text')
                    //- .form-group
                    //-     label.control-label.mb-1(for='password') Password *
                    //-     input#password.form-control(name='password', type='password')
                    button.btn.btn-success.btn-flat.m-b-30.m-t-30(type='submit') Sign in

1 ответ

По умолчанию LocalStrategy требует имя пользователя и пароль, но вы можете легко переопределить это:

    passport.use(new LocalStrategy({
        usernameField: 'username',
        passwordField: 'username',
      },
      function(username, password, done) {
        // ...
      }
    ));

Который в основном использует username поле для имени пользователя и пароля. просто игнорируйте пароль и используйте имя пользователя.

Другие вопросы по тегам