使用快递的护照JS,“本地”策略的身份验证每次都会返回“缺少凭据”

问题描述 投票:0回答:1

我的问题是,在POST上,每当尝试使用“本地”策略进行身份验证时,都会收到“缺少凭据”错误。最初,我认为这是body解析器的问题,但是即使在提出了一些关于强制进行urlencoded的建议之后,也还是没有得到任何不同的结果。我的控制台日志也没有返回任何实质性的内容,除了无关紧要的req.body之外,我真的不确定此时还需要做什么。我已经读到这是特定版本的Express的潜在问题,但是我已经尝试过降级/升级,并且没有任何改变。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9OSUMzbi5wbmcifQ==” alt =“我正在获取错误的代码段1”>

带有一些断点,似乎从未调用过我的PassportConfig.js中的新localStrategy,但是我不确定是不是我的错误?非常感谢这里的一些提示。

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);

我的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);
    });
  })
);

用于基本用户注册/登录系统的我的控制器:

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 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问题,但这似乎也不是。

node.js express authentication local
1个回答
0
投票

您是发布请求中的身份验证用户(clrlUser.authenticate)。而不是在控制器中使用authenticate方法,而是在路由中使用此方法,如下所示:

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

此外,您还可以在PassportConfig.js中以本地策略方法管理用户注册。

© www.soinside.com 2019 - 2024. All rights reserved.