Любой полный пример для экспресс-jwt?

Я хочу использовать express-jwt в своем приложении экспресс-узла, но не могу найти примеры, демонстрирующие часть входа в систему.

Любая помощь, пожалуйста?


person Saro    schedule 22.09.2017    source источник
comment
Спасибо, Сухейл, за поиск в Google для меня. :) Если вы посмотрите на первый пример, экспресс-jwt не используется. а во втором я не могу найти самую важную часть процесса: вход в систему. Я видел эти ссылки, прежде чем задавать вопрос здесь.   -  person Saro    schedule 22.09.2017
comment
Suhail прислал вам хорошие примеры, которых достаточно, чтобы попробовать jwt. Или, может быть, вы не полностью описываете свою цель. В общем случае пользователь делает запрос на вход/вход, сервер проверяет учетные данные (например, адрес электронной почты, пароль) и отправляет обратно клиенту jwt-токен. Затем каждый раз, когда зарегистрированный клиент хочет получить некоторые защищенные данные, ему нужно добавлять этот токен для каждого запроса (например, в заголовке)   -  person Helen    schedule 22.09.2017
comment
Хотя вопрос не относится к теме SO, очень жаль, что на него нет хорошего ответа, потому что примеры для express-jwt граничат с бесполезностью.   -  person stripybadger    schedule 30.04.2020


Ответы (1)


Я бы порекомендовал вам попытаться понять принцип JWT и то, как они передаются между сервером и клиентом и сопоставляются на стороне сервера с секретом - вот документ

введите здесь описание изображения

Полезной нагрузкой могут быть любые произвольные пользовательские данные, то есть просто имя пользователя или идентификатор.

В основном вам нужна служба, которая генерирует токен при успешной аутентификации (когда пользователь входит в систему с соответствующими учетными данными, например: usr и pwd) и создает дополнительный заголовок с токеном, который будет использоваться в дальнейших запросах к серверу.

Для jwt-express вам, очевидно, необходимо установить пакет (так же, как и для jsonwebtoken), например :

npm install jwt-express --save

затем инициализируйте его так:

var jwt = require('jwt-express');
app.use(jwt.init('secret'));

из документов:

Функция jwt.init() возвращает промежуточную функцию для Express, поэтому ее нужно вызывать внутри app.use(). Он автоматически прочитает JWT либо из файла cookie, либо из заголовка авторизации (настроенного вами) и добавит объект JWT в объект запроса (req). Он также добавит метод jwt() к объекту Response (res) для создания/сохранения JWT. jwt.init() должен вызываться перед любым другим методом jwt.

Это ваши варианты:

  • cookie: (строка) имя файла cookie (по умолчанию: 'jwt-express')
  • cookieOptions: (объект) параметры для использования при сохранении файла cookie (по умолчанию: {httpOnly: true})
  • куки: (логическое значение) Если true, будут использоваться куки, в противном случае будет использоваться заголовок авторизации (по умолчанию: истина)
  • Refresh: (логическое значение) Указывает, следует ли обновлять и сохранять JWT при каждом запросе (по умолчанию: true).
  • reqProperty: (строка) Заполняемое свойство req (по умолчанию: 'jwt')
  • revoke: (функция) jwt.revoke() вызовет эту функцию (по умолчанию: function(jwt) {})
  • signOptions: (объект) параметры для использования при подписании JWT (по умолчанию: {})
  • stales: (число) миллисекунд, в течение которых jwt устареет (по умолчанию: 900000 (15 минут))
  • Verify: (функция) Дополнительная проверка. Должен возвращать логическое значение (по умолчанию: function(jwt) {return true})
  • VerifyOptions: (объект) параметры для использования при проверке JWT (по умолчанию: {})

Остальная логика зависит от вас, но мои примеры должны дать вам четкое представление о том, как управлять jwt в вашем приложении.

Вот пример того, как я реализовал jwt через jsonwebtoken:

 // INFO: Function to create headers, add token, to be used in HTTP requests
  createAuthenticationHeaders() {
    this.loadToken(); // INFO: Get token so it can be attached to headers
    // INFO: Headers configuration options
    this.options = new RequestOptions({
      headers: new Headers({
        'Content-Type': 'application/json', // INFO: Format set to JSON
        'authorization': this.authToken // INFO: Attach token
      })
    });
  }

  // INFO: Function to get token from client local storage
  loadToken() {
    this.authToken = localStorage.getItem('token');; // Get token and assign to variable to be used elsewhere
  }

и некоторые функции для хранения пользовательского статуса i.E.:

 // INFO: Function to store user's data in client local storage
 storeUserData(token, user) {
   localStorage.setItem('token', token); // INFO: Set token in local storage
   localStorage.setItem('user', JSON.stringify(user)); // INFO: Set user in local 
  storage as string
      this.authToken = token; // INFO: Assign token to be used elsewhere
      this.user = user; // INFO: Set user to be used elsewhere
    }

и функция выхода из системы для уничтожения токена в локальном хранилище, т.е.:

 // INFO: Function for logging out
 logout() {
this.authToken = null; // INFO: Set token to null
   this.user = null; // INFO: Set user to null
   localStorage.clear(); // INFO: Clear local storage
 }

Если вы используете jsonwebtoken от npm, вы можете установить ttl токена при его создании:

const token = jwt.sign({ id: idDB }, "secret", { expiresIn: '24h' }); 

или какой бы ttl вы ни пожелали, секрет строки относится к секрету, который сопоставляется с сервером.

person iLuvLogix    schedule 09.10.2018
comment
Это спасает мою работу, спасибо ‹3 - person princebillyGK; 12.03.2020
comment
@princebillyGK Добро пожаловать ;) - person iLuvLogix; 12.03.2020
comment
Ссылка на jwt-express, помеченная как express-jwt, несколько вводит в заблуждение. - person Will Sadler; 14.08.2020
comment
Спасибо за подсказку, @WillSadler - я немедленно исправлю это;) - person iLuvLogix; 17.08.2020