如何在 express 上使用 passport-jwt 策略来保护 post 路由

How to use passport-jwt strategy on express to protect post route

我在我的应用程序上使用 passportJs 对用户进行身份验证,我可以创建用户,为他们创建凭据,他们可以毫无问题地登录。对于受保护的路线,我正在使用 passport-jwt 策略,并且所有路线都可以正常工作。但是,我一直在尝试对创建这些用户的路由使用相同的通行证策略,但无论我做什么,我总是得到未经授权的响应 401。在前端,我使用 react 和 axios。 这是我的护照代码:

const opts = {
        jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme("JWT"),
        secretOrKey: process.env.JWT_SECRET
    };

passport.use(
        "jwtToPostUser",
        new JWTstrategy(opts, (jwt_payload, done) => {
            try {
                User.findOne({
                    where: {
                        email: jwt_payload.email
                    }
                }).then(user => {
                    if (user) {
                        console.log("user found in db in passport");
                        done(null, user);
                    } else {
                        console.log("user not found in db");
                        done(null, false);
                    }
                });
            } catch (err) {
                done(err);
            }
        })
    );

创建用户的路径如下:

router.post(
    "/signup",
    passport.authenticate("jwtToPostUser", { session: false }),
    (req, res, next) => {
        console.log(req.body);

        const {
            businessname,
            username,
            firstName,
            lastName,
            phoneNumber,
            email,
            password,
            customerStatus,
            userType,
            Gooduntil
        } = req.body;

        if (password.length < 8) {
            throw "Password must be at least 8 characters";
        } else {
            User.findOne({
                where: {
                    email
                }
            }).then(user => {
                if (user) {
                    res.send("Email already exists!");
                } else {
                    const encryptedPassword = bcrypt.hashSync(password, salt);

                    let newUser = {
                        businessname,
                        username,
                        firstName,
                        lastName,
                        phoneNumber,
                        email,
                        password: encryptedPassword,
                        customerStatus,
                        userType,
                        Gooduntil
                    };
                    User.create(newUser)
                        .then(() => {
                            // newUser.isAdmin = true
                            delete newUser.password;
                            res.send(newUser);
                        })
                        .catch(function(err) {
                            console.log(err);
                            res.json(err);
                        });
                }
            });
        }
    }
);

此 JWT 策略适用于所有获取路由,但创建用户的这条路由除外。

这是我对前端的要求:

 addClient = async e => {

        let newUser = {
                businessname: businessname.toLowerCase(),
                firstName: firstName.toLowerCase(),
                lastName: lastName.toLowerCase(),
                email,
                username,
                password,
                phoneNumber,
                customerStatus: customerStatus.value,
                userType,
                Gooduntil
            };
            const accessString = localStorage.getItem("JWT");
            await Axios.post(
                "/auth/signup",
                {
                    headers: {
                        Authorization: `JWT ${accessString}`
                    }
                },
                newUser
            )
                .then(res => {
                    console.log(res);
                    this.setState({
                        loadingAxiosReq: false
                    });
                })
                .catch(err => console.log(err));
    }

这是我收到的错误:错误:请求失败,状态代码为 401

有人知道为什么会这样吗?我能让它工作的唯一方法是从注册路径中删除 passport-JWT 策略,但这并不安全。请帮忙!

您确定在您的 POST 请求中附加了您的身份验证令牌吗?

我将 header 设置为授权,我将其替换为 jwt,现在可以完美运行了。