Как защитить токен JWT и обновить токен в nodejs / angular - PullRequest
0 голосов
/ 25 сентября 2019

Я новичок в узле JS.Я создаю простое приложение для создания заметок и хотел использовать токены JWT для аутентификации и защиты своих API.В ходе исследования я узнал, что мне нужно создать два токена:

  1. токен доступа (короткое время истечения, например, 10 минут)
  2. токен обновления (более длительное время истечения 30 дней)

Мой конфигурационный файл

"secret": "*************",
"refreshTokenSecret": "*************",
"port": 5000,
"tokenLife": 900,
"refreshTokenLife": 86400

Код для промежуточного программного обеспечения

const jwt = require('jsonwebtoken')
const config = require('./config')

module.exports = (req,res,next) => {
  const token = req.body.token || req.query.token || req.headers['x-access-token']
  // decode token
  if (token) {
    // verifies secret and checks exp
    jwt.verify(token, config.secret, function(err, decoded) {
        if (err) {
            return res.status(401).json({"error": true, "message": 'Unauthorized access.' });
        }
      req.decoded = decoded;
      next();
    });
  } else {
    // if there is no token
    // return an error
    return res.status(403).send({
        "error": true,
        "message": 'No token provided.'
    });
  }
}

Вот ответ

enter image description here

токен доступа можно сохранить в локальном хранилище.но в статьях сказано, что токен обновления сохранен как файл cookie только для http.Мне нужен ответ на следующие вопросы (Помните, что я только начинающий):

  1. Как сохранить токен обновления в виде файла cookie только для http (любой пример кода для node-js будет очень полезен))?
  2. Как обезопасить его на стороне клиента и нужно ли мне сохранять токен обновления в базе данных?
  3. Есть ли какое-нибудь другое лучшее решение для защиты моего API?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Вы можете использовать файл cookie только для http, используя следующее:

public authenticateUser(user: User, res: Response) {
        const authJwtToken = this.generateJWT({
            email: user.email,
            uuid: user.uuid
        });

        const cookieOptions = {
            maxAge: 3600000,
            secure: true,
            httpOnly: true
        };

        res.cookie('access_token', authJwtToken, cookieOptions);
    }
// you can then res.send({...}) or wtv

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

Теперь, будете ли вы хранить его в базе данных, зависит от того, чего вы хотите достичь.Обычно это не требуется, но имейте в виду, что в этом случае сервер никоим образом не может сделать недействительным один JWT.(Теоретически вы можете изменить ключ подписи, но это приведет к аннулированию всех из них).

В случае, если вы захотите получить такую ​​функциональность, как «Выйти из всех устройств», вам нужно будет сохранитьJWT выпускаются для каждого пользователя в базе данных (предпочтительно в оперативной памяти, такой как Redis или Memcached) и выполняют вторую проверку с дополнительной информацией о том, были ли они признаны недействительными или нет - даже если такая функциональность обычно достигается с помощью сеансов вместоJWT

0 голосов
/ 25 сентября 2019

Посмотрите этот пример, как я защитил мой getByRefId API в nodjs:

В файле маршрутов:

router.get("/refId/:refId", helper.auth, groupController.getByRefId);

helper.auth is   function  :

auth: (req, res, next) => {
    var token = req.body.token || req.headers['authorization'] || req.headers['Authorization'];

    if (token.startsWith('Bearer ')) {
        // Remove Bearer from string
        token = token.slice(7, token.length).trimLeft();
    }

    if (token) {
        jwt.verify(token, 'MY_SECRET', function (err, decoded) {
            if (err) {
                console.error('JWT Verification Error', err);
                return res.status(403).send(err);
            } else {
                req.payload = decoded;
                return next();
            }
        });
    } else {
        res.status(403).send('Token not provided');
    }
}

Это использование jwt = require ('jsonwebtoken ') библиотека, вы можете установить ее в проекте nodejs

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