Как защитить маршруты на клиентском сервере с помощью JWT, сгенерированного из моего RESTful backend API? - PullRequest
0 голосов
/ 28 октября 2018

Я пытался создать приложение для регистрации / входа с помощью Nodejs.Просматривая статьи, я понял, что это хорошая структура для разработки вашего приложения, так что ваш бэкэнд на самом деле является API RESTful, а ваш клиент обращается к этому API.(И клиент, и сервер работают на разных серверах, тогда как клиент - это просто старый статический файловый сервер).

Теперь все прошло гладко, пока мне не пришлось входить в систему пользователей. Когда конечная точка API (/ signin) ск конкретным данным обращаются, данные проверяются по базе данных, и если все в порядке, я подписываю веб-токен JSON и передаю его клиенту.

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

Но чтоя могу сделать, чтобы принудить то же самое на моем клиенте с этим JWT?Например, если в моем клиенте у меня есть dashboard.html, и я хочу, чтобы он был доступен только зарегистрированным пользователям, пользователь может продолжить и получить сгенерированный JWT.Но как этот JWT вступает в игру по поводу ограничения клиентских маршрутов?

Мой маршрут входа в систему:

app.post('/signin', (req, res) => {
var data = req.body;

if (!exists(data.username) || !exists(data.password))
    return res.status(422).json({
        message: 'All fields are required'
    });

const users = db.get('users');
users
    .findOne({
        username: data.username,
        password: shajs('sha256').update(data.password).digest('hex')
    })
    .then((user) => {
        if (user) {
            jwt.sign({
                _id: user._id,
                username: user.username
            }, 'keyboard_cat', {
                expiresIn: '1h'
            }, (err, tok) => {
                return res.status(200).json({
                    message: 'OK',
                    token: tok
                });
            });
            return;
        }

        return res.status(200).json({
            message: 'Invalid Username or Password.'
        })
    });
});

1 Ответ

0 голосов
/ 28 октября 2018

Вы можете использовать условный рендеринг на внешней стороне.Вы можете запустить API с помощью токена API (сгенерированного из '/ signin' api), который сообщит вам, действителен ли токен API, когда вы входите в маршрут.На основании ответа сервера о токене вы можете решить, какую страницу отображать (обычную или неавторизованную).

Существует также лучший подход - отправлять маркер api на каждом маршруте в заголовке, а если токен деформирован или недействителен, вернуть ошибку 401 из бэкэнда.Перехватить эту ошибку глобально (или вы можете использовать перехватчик ответа, который предоставляется axios ), а затем выполнить условный рендеринг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...