Паспорт JS с использованием express, аутентификация по стратегии «Локальный» каждый раз возвращает «Отсутствующие учетные данные» - PullRequest
0 голосов
/ 24 февраля 2020

Моя проблема в том, что на POST я получаю ошибку «Missing Credentials» всякий раз, когда я пытаюсь аутентифицироваться, используя «локальную» стратегию. Сначала я думал, что это проблема body-parser, но даже после некоторых предложений по принудительному использованию urlencoded: true / false, я по-прежнему не получаю никаких других результатов. Мои журналы консоли также не возвращают ничего существенного, кроме несоответствующего req.body, и я действительно не уверен, что еще делать на этом этапе. Я читал, что это потенциальная проблема с указанными c версиями Express, но я пробовал понизить / обновить, и это ничего не изменило.

Snippet of the error I'm getting1

С некоторыми точками останова похоже, что моя новая localStrategy в PassportConfig. js никогда не вызывается, но я не совсем уверен, является ли это моей ошибкой или нет? Буду очень признателен за некоторые указатели здесь.

app. js

require("./config/config");
require("./models/db");
require("./config/passportConfig");

const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const passport = require("passport");

// router
var rtsIndex = require("./routes/index.router");

var app = express();

// middleware config
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
app.use(passport.initialize());
app.use(passport.session());
app.use("/api", rtsIndex);

My PassportConfig. js:

const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const mongoose = require("mongoose");

var User = mongoose.model("User");

passport.use(
  new LocalStrategy({ usernameField: "email" }, (username, password, done) => {
    User.findOne({ email: username }, (err, user) => {
      if (err) return done(err);
      // if user is unknown
      else if (!user)
        return done(null, false, {
          message: "That email address has not been registered"
        });
      // or if password is wrong
      else if (!user.verifyPassword(password))
        return done(null, false, { message: "Wrong password" });
      // successful authentication
      else return done(null, user);
    });
  })
);

Мой контроллер для основы c регистрация пользователя / система входа в систему:

const mongoose = require("mongoose");
const passport = require("passport");
const _ = require("lodash");

User = require("../models/user.model");

// snipped some registration code for brevity

module.exports.authenticate = (req, res, next) => {
  console.log(req.body);
  // call for passport authentication
  // executed passport.use from passportConfig
  passport.authenticate("local", (err, user, info) => {
    // Error from passport middleware
    if (err) return res.status(400).json(err);
    // user is registered if there is a value in 'user'
    else if (user) return res.status(200).json({ token: user.generateJwt() });
    // user unkown or wrong password
    else return res.status(401).json(info);
  })(req, res);
};

Редактировать: Добавлены также определения моей модели пользователя:

const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");

var userSchema = new mongoose.Schema({
  fullName: {
    type: String,
    required: "Full name cannot be empty"
  },
  email: {
    type: String,
    required: "Email cannot be empty",
    unique: true
  },
  password: {
    type: String,
    required: "Password cannot be empty",
    minlength: [4, "Password must be at least 4 characters long"]
  },
  // Encryption/Decryption of password
  saltSecret: String
});

// Custom validation for email
userSchema.path("email").validate(val => {
  emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return emailRegex.test(val);
}, "Invalid email");

// Events
userSchema.pre("save", function(next) {
  bcrypt.genSalt(10, (err, salt) => {
    bcrypt.hash(this.password, salt, (err, hash) => {
      this.password = hash;
      this.saltSecret = salt;
      next();
    });
  });
});

// Methods
userSchema.methods.verifyPassword = function(password) {
  // plain password, vs encrypted password,
  // called from findOne in passportConfig
  return bcrypt.compareSync(password, this.password);
};

userSchema.methods.generateJwt = function() {
  return jwt.sign({ _id: this._id }, process.env.JWT_SECRET, {
    expiresIn: process.env.JWT_EXP
  });
};

// Can pass custom name as third paramater
// Modified with a force export for debugging
module.exports = mongoose.model("User", userSchema);

И, наконец, некоторые базовые c маршрутизация:

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

const ctrlUser = require("../controllers/user.controller");

// foreword all links with api/
router.post("/register", ctrlUser.register);
router.post("/authenticate", ctrlUser.authenticate);

// Export router for middleware so app.js can access it
module.exports = router;

Я попробовал следующие решения этих вопросов:

Поскольку это не проблема парсера тела, я подумал, что это может быть проблема usernameField, но, похоже, это тоже не так.

1 Ответ

1 голос
/ 24 февраля 2020

Я опробовал ваш код, который вы упомянули выше. И я сделал небольшое изменение и удалил некоторые проверки. Я упоминаю все файлы ниже:

passportMiddleware. js

import passportLocal from 'passport-local';
const localStrategy = passportLocal.Strategy;
import userModel from '../model/userModel';
import passport from 'passport';
import bcrypt from 'bcrypt';

passport.use(new localStrategy({
        usernameField: 'email',
    }, async (email, password, done) => {
        const user = await userModel.findOne({ "email": email });
        // console.log(user)
        if (!user) {
            return done(null, false);
        }
        try {
            if (password === user.password) {
                return done(null, user)
            } else {
                return done(null, false, 'password Incorrect')
            }
        } catch (error) {
            return done(error)
        }
    }));

userController. js

import userModel from '../model/userModel';
import bcrypt from 'bcrypt';
import passport from 'passport';

exports.authenticate = (req, res, next) => {
        res.status(200).json({ messaage: 'Authenticated', data: req.user 
    });
};

userModel. js

import mongoose from 'mongoose';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';

var userSchema = new mongoose.Schema({
            name: {
                type: String,
                required: true
            },
            email: {
                type: String,
                required: true,
                unique: true
            },
            password: {
                type: String,
                required: true,

            }
        });

        // Events
        userSchema.pre("save", function (next) {
            bcrypt.genSalt(10, (err, salt) => {
                bcrypt.hash(this.password, salt, (err, hash) => {
                    this.password = hash;
                    this.saltSecret = salt;
                    next();
                });
            });
        });

        module.exports = mongoose.model("Users", userSchema);

маршруты. js

router.post('/authenticate', passport.authenticate('local', { session: false }), userController.authenticate);

Попробуйте это из Сначала импортируйте зависимость.

, как только вы успешно пройдете аутентификацию, используя passport-local Вы можете вносить изменения в соответствии с вашими критериями.

У меня есть зависимости импорта в формате ES6. Вы просто измените его на ES5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...