node.js - 无法使用 Passport POST /api/users/login
问题描述
我按照 Brad Traversy 的教程如何设置 Passport 身份验证,但它对我不起作用。当我将 Postman POST 请求发送到 /api/users/login 路由时,我得到了带有<pre>Cannot POST /api/users/login</pre>
内部正文的 HTML 代码,但我在后端得到了正确的 req.body 并且认证通过了。
此外,当用户名和密码不正确时,我从 api 调用中得到的都是未经授权的
我认为存在问题,因为 Brad 使用服务器端渲染,而我使用带有 api 调用的客户端 React 应用程序
有人可以解释我可以改变什么以使其工作吗?我认为这是因为没有res.json(user)
,但是当没有将用户数据存储在 /login 路由中的变量时如何发送该用户。
有一个 /login 路由
router.post('/login', async (req, res, next) => {
const { error } = loginValidation(req.body)
if (error) return res.json(error.details[0].message)
const { username, password } = req.body
passport.authenticate('local', {})(req, res, next)
})
还有我的 Passport 配置
const LocalStrategy = require('passport-local').Strategy
const mongoose = require('mongoose')
const bcrypt = require('bcrypt')
const passportJWT = require('passport-jwt')
const JWTStrategy = passportJWT.Strategy
const User = require('../db/models/User')
module.exports = passport => {
passport.use(
new LocalStrategy((username, password, done) => {
User.findOne({ username })
.then(user => {
if (!user)
return done(null, false, {
message: 'User not found',
})
bcrypt.compare(
password,
user.password,
(err, isMatch) => {
if (err) throw err
if (isMatch) {
return done(null, user)
} else {
return done(null, false, {
message: 'Password incorrect',
})
}
},
)
})
.catch(err => console.log(err))
}),
)
// passport.use(
// JWTStrategy(
// {
// jwtFromRequest: passportJWT.ExtractJwt.fromAuthHeaderAsBearerToken(),
// secretOrKey: process.env.JWT_SECRET,
// },
// (payload, done) => {
// User.findOne({ _id: payload.user._id })
// .then(user => {
// return done(null, user)
// })
// .catch(err => {
// return done(null, false, {
// message: 'Token not matched',
// })
// })
// },
// ),
// )
passport.serializeUser((user, done) => {
done(null, user.id)
})
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user)
})
})
}
解决方案
推荐阅读
- c# - 如何将默认标题“授权”设置为一个值
- node.js - 使用 Node.js 运行 Kurento Hello World 时出现问题
- java - 将按钮颜色从红色更改为彩色时,按钮充气器崩溃
- python - 在熊猫中按条件计算连续出现的次数
- android - 如何在 AndroidTV 上设置默认呼叫应用程序?
- python - groupby:尝试按国家分组并列出每个国家的前 10 个品种以及平均价格和平均积分
- javascript - 如何从 Javascript 父级调用 Iframe 中的子 AngularJs 函数?
- c# - 使用 XAML 为多个控件设置 DataContext
- jquery - 如何将多个参数从服务器发送到 js 地图
- layout - Nativescript 中全屏 web 视图上的浮动按钮