Как передать токен для проверки пользователя на html-страницах с помощью node js

#html #node.js

#HTML #node.js

Вопрос:

Я пытаюсь передать токен, который проверяет, какой пользователь вошел в систему на HTML-страницах. После входа пользователя в систему создается токен, который содержит user _Id. Я хочу использовать эту информацию, чтобы получить имя пользователя и отобразить его на HTML-страницах.

/api/user/login

 router.post('/login', async (req, res) => {
    //Validate befor use
    const { error } = loginValidation(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    const user = await User.findOne({ email: req.body.email });
    if (!user) return res.status(400).send('Email is not found');

    const validPass = await bcrypt.compare(req.body.password, user.password);
    if (!validPass) return res.status(400).send('Invalid pasword');

    //Create and assign a token
    const token = jwt.sign({ _id: user._id }, process.env.Token_SECRET);
    res.header('auth-token', token);
    if (!error) res.redirect('/public/index.html');
});
 

Проблема, с которой я сталкиваюсь, заключается в том, что после повторного перенаправления обратно в индекс я теряю токен. Я хочу иметь возможность передавать токен на другие HTML-страницы.

Я придумал несколько способов решения этой проблемы, но единственный способ, о котором я мог подумать, — создать другой файл маршрутов, чтобы я мог использовать

 router.get('/', verify, (req, res, next) => {
    res.send(req.user);
})
 

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

Комментарии:

1. Является ли использование файлов cookie вариантом?

2. Да, использование файлов cookie — это вариант. Что бы ни работало

3. В этом случае просто поместите токен в файл cookie сразу после const token = ... , а затем перенаправьте их на /public/index.html . Затем добавьте промежуточное программное обеспечение, которое проверяет токен, считанный из файла cookie, на каждом авторизованном маршруте. Для этого вы можете использовать любую библиотеку cookie. Например. npmjs.com/package/cookie

4. Или используйте localStorage. Предпосылка заключается в том, чтобы хранить значение токена где-нибудь при переходе со страницы на страницу. Файлы cookie — это лишь одно из средств достижения этой цели.

Ответ №1:

Одним из очень распространенных решений является сохранение токена на стороне клиента после входа пользователя в систему. Чтобы сохранить его на стороне клиента в 1 источнике, вы можете использовать localStorage .

 
localStorage.setItem('token', 'xxxxxxaaaaaaannnnnnnnccccc.asdaasdasdasdasd');
const token = localStorage.getItem('token');

 

В вашем маршруте входа в систему вам, очевидно, придется возвращать данные, а не перенаправлять. Итак, верните токен пользователю, и после того, как пользователь получит токен, сохраните его, localStorage а затем вы можете сделать перенаправление также на стороне клиента.

 // server
// after successful token create
res.status(200).json({ token : token });
 
 // client
// similar behavior as an HTTP redirect
window.location.replace("http://stackoverflow.com");

// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";
 

Если новая страница находится в том же источнике, localStorage заданный вами по-прежнему доступен.

Ответ №2:

Я предполагаю, что у вас также есть контроль над интерфейсным приложением, если это так, я считаю, что один из способов — требовать токен для каждого запроса, который получает API, который классифицируется как «страница входа в сеанс», например: получить информацию из API, удалить учетную запись…

Для этого, как только вы отправляете в res токен, каждый раз, когда api получает запрос «необходимо войти в систему», вы можете добавить промежуточное программное обеспечение, используемое во всех запросах, требующих токена, что-то вроде этого:

     const jwt = require('jsonwebtoken');
    const authConfig = require('./auth.json');// defining a SecretKey for the authtoken
    
    
    module.exports = (req, res, next) => {
    const authHeader = req.headers.authorization;

    if (!authHeader) {
        return res.status(401).send({ error: 'No token provided' });
    }

    jwt.verify(token, authConfig.secret, (err, decoded) => { // here you verify the authtoken = key   token
        if (err) {
            return res.status(401).send({ error: 'Token invalid' });
        }
        return next();
    });
}
 

Что касается интерфейса, вам нужно будет локально сохранить предоставленный токен, возможно, в безопасных файлах cookie, как показано в документах MDN здесь, например:

 document.cookie='authToken=[token]'// where token is the value saved as a string
 

И в следующий раз, когда клиент переходит с запросом на страницу входа в систему, вы отправляете токен, сохраненный как cookie, например, в заголовке авторизации:

     myGETRequest = () => {
        const authToken = document.cookie.split('; ').find(row => row.startsWith('authToken'))
  .split('=')[1]; //all cookies are saved together in one string

        fetch(`http://yourURL`, {
            "method": "GET",
            "headers": {
                "authorization": authToken, 
                "Content-Type": "application/json"
            },
        })
            .then(res => {
                res.json().then(res => console.log(res))
            })
            .catch(err => {
                console.log(err)
            })
    }
 

Для получения дополнительной информации вы можете проверить документы W3schools о файлах cookie здесь или документы MDN здесь

Ответ №3:

Почему бы вам не прикрепить токен к URL-адресу перенаправления? JWT обычно имеет ограниченное время жизни. Тот, кто сможет получить доступ к вашему токену позже, не сможет его использовать.