首页 > 解决方案 > 无法使用 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)
        })
    })
}

标签: node.jsapirestexpresspassport.js

解决方案


推荐阅读