Как использовать стратегию passport-jwt на express для защиты почтового маршрута - PullRequest
0 голосов
/ 19 февраля 2020

Я использую паспорт Js для аутентификации пользователей в моем приложении, я могу создавать пользователей, создавать их учетные данные, и они могут входить без проблем. Для защищенных маршрутов я использую стратегию passport-jwt, и все маршруты работают нормально. Тем не менее, я пытался использовать ту же стратегию паспорта для маршрута, которая создает этих пользователей, но независимо от того, что я делаю, я всегда получаю несанкционированный ответ 401. На внешнем интерфейсе я использую реагировать и ax ios. Вот мой паспортный код:

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);
                        });
                }
            });
        }
    }
);

Эта JWTstrategy работает для всех маршрутов получения, кроме этого, который создает пользователя .

Вот мой запрос от внешнего интерфейса:

 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 из маршрута регистрации, но это небезопасно. пожалуйста помогите!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Я устанавливал заголовок с Авторизацией, вместо этого я заменил его на jwt, теперь работает отлично.

0 голосов
/ 19 февраля 2020

Вы уверены, что приложили свой токен авторизации к вашему POST-запросу?

...