浏览器中缺少护照身份验证凭据



我正在学习如何使用passport.js实现用户身份验证;本地";在服务器端设置的策略,到目前为止只有一条POST路由来登录用户。这一切在解决失眠问题时都能正常工作,但当我从浏览器发出相同的请求时,我会收到一条消息missing credentials。此消息来自controllers/auth.js.中的console.log(info)

我已经尝试在获取请求中包含凭据,如下所示,但我一定遗漏了其他内容或包含错误。我还将变量名从"email"更改为"username",因为我读到这是passport.js.的默认名称

从我在Chrome开发工具中可以看出,请求主体的格式是正确的,我正在到达正确的端点。

控制器/auth.js

const express = require("express");
const router = express.Router();
const passport = require("passport");
router.post("/register_login", (req, res, next) => {
passport.authenticate("local", function(err, user, info) {
console.log(info)
if (err) {
return res.status(400).json({ errors: err });
}
if (!user) {
return res.status(400).json({ errors: "No user found" });
}
req.logIn(user, function(err) {
if (err) {
return res.status(400).json({ errors: err });
}
return res.status(200).json({ success: `logged in ${user.id}` });
});
})(req, res, next);
});
module.exports = router;

passport/setup.js

const bcrypt = require('bcrypt');
const { User } = require('../models');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
// Local Strategy
passport.use(new LocalStrategy((username, password, done) => {
// Match User
User.findOne({ email: username })
.then(user => {
// Create new User
if (!user) {
return done(null, false, { message: 'No user found!!'})
// Return other user
} else {
// Match password
bcrypt.compare(password, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Wrong password' });
}
});
}
})
.catch(err => {
return done(null, false, { message: err });
});
})
);
module.exports = passport;

客户端提取

const handleLogin = async (evt) => {
evt.preventDefault();
const response = await fetch('/auth/register_login', {
method: 'POST',
credentials: 'include',
withCredentials: true,
body: JSON.stringify({
"username": "test@email.com",
"password": "password"
})
})
return response;
};

Oof,这是一个简单的问题。。。

我正在读";内容类型";然而,在Chrome开发工具中;响应报头";以为他们是";请求报头";。问题是我发送的是文本而不是json。

将客户端获取更改为下面的代码段解决了此问题。

客户端提取

const handleLogin = async (evt) => {
evt.preventDefault();
const response = await fetch('/auth/register_login', {
method: 'POST',
credentials: 'include',
withCredentials: true,
headers: {
'Content-Type': 'application/json' // <--add this
body: JSON.stringify({
"username": "test@email.com",
"password": "password"
})
})
return response;
};

最新更新