我的问题是,在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问题,但这似乎也不是。
您是发布请求中的身份验证用户(clrlUser.authenticate)。而不是在控制器中使用authenticate方法,而是在路由中使用此方法,如下所示:
router.post("/authenticate",passport.authenticate('local', { session: false }), ctrlUser.authenticate);
此外,您还可以在PassportConfig.js中以本地策略方法管理用户注册。