Node.js использует express-jwt для разбора JWT

Node.js
Node.js использует express-jwt для разбора JWT

Паспорт обычно используется для аутентификации токенов в Node.js, что позволяет настроить стратегию проверки, но если вы используете экспресс-фреймворк и вам нужно только проанализировать JWT, вы можете попробовать промежуточное ПО express-jwt.

О JWT

Полное название JWT — веб-токен JSON, который представляет собой решение, заменяющее традиционную аутентификацию сеанса. Принцип заключается в том, что сервер генерирует объект JSON, содержащий уникальный идентификатор пользователя, и выдает его клиенту. Когда клиент запрашивает интерфейс, для которого требуются разрешения, ему нужно только отправить JSON обратно на сервер в том виде, в котором он есть, и сервер может идентифицировать пользователя посредством синтаксического анализа.

Обычно это выглядит так:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Этот объект JSON передается.Он разделен на три раздела, включая заголовок запроса (алгоритм шифрования), информацию о полезной нагрузке (например, идентификатор пользователя, время истечения срока действия) и подпись, сгенерированную ключом сервера, чтобы гарантировать, что он не подделан.

Благодаря этому механизму серверу больше не нужно хранить токен, поэтому это очень легкая схема аутентификации пользователя. А для междоменной аутентификации, такой как микрослужбы, требующие совместного использования токенов между различными службами, JWT в настоящее время является лучшим выбором.

О экспресс-jwt

Express-jwt — это библиотека с открытым исходным кодом для Node.js, разработанная auth0, поставщиком услуг аутентификации ID, и промежуточное программное обеспечение, предназначенное для синтаксического анализа JWT в рамках экспресс-фреймворка.

Он очень прост в использовании и автоматически назначит часть полезной нагрузки JWT наreq.user, что логической части удобно вызывать.

начать использовать

Установить

npm install express-jwt

Добавить промежуточное ПО

const expressJwt = require('express-jwt')

app.use(expressJwt({
  secret: 'secret12345'  // 签名的密钥 或 PublicKey
}).unless({
  path: ['/login', '/signup']  // 指定路径不经过 Token 解析
}))

Создать токен

Метод генерации Token все еще используетсяjsonwebtoken, например, добавьте следующий код в возвращаемую часть интерфейса входа:

const jwt = require('jsonwebtoken')

app.post('/login', function (req, res) {
  // 注意默认情况 Token 必须以 Bearer+空格 开头
  const token = 'Bearer ' + jwt.sign(
    {
      _id: user._id,
      admin: user.role === 'admin'
    },
    'secret12345',
    {
      expiresIn: 3600 * 24 * 3
    }
  )
  res.json({
    status: 'ok',
    data: { token: token }
  })
})

Получить проанализированный контент

При получении запроса с токеном, если парсинг прошел успешно, его можно передать в обратном вызове маршрутизацииreq.userпосещать:

app.get('/protected', function (req, res) {
  if (!req.user.admin)
    return res.sendStatus(401)
  res.sendStatus(200)
})

req.userНа самом деле это полезная часть JWT:

{
  _id: '5dbbc7daaf7dfe003680ba39',
  admin: true,
  iat: 1572587484,
  exp: 1573192284
}

Не удалось выполнить синтаксический анализ

Если синтаксический анализ не удался, бросаетUnauthorizedError, которые могут быть захвачены пост-промежуточным программным обеспечением:

app.use(function (err, req, res, next) {
  if (err.name === 'UnauthorizedError') {   
    res.status(401).send('invalid token')
  }
})

Изменить поля результатов

Результат синтаксического анализа по умолчанию будет назначен вreq.user, также черезrequestPropertyмодифицировать:

app.use(expressJwt({
  secret: 'secret12345',
  requestProperty: 'auth'
}))

Разрешить запросы без токенов

Когда интерфейс разрешает доступ без токена и с токеном (например, после того, как детали статьи вошли в систему, чтобы судить о том, как), вы можете пройтиcredentialsRequired: falseЧтобы не парсить и не выбрасывать исключения для запросов без токенов.

app.use(expressJwt({
  secret: 'secret12345',
  credentialsRequired: false
}))

пользовательский синтаксический анализ

По умолчанию express-jwt запрашивает заголовки изAuthorizationполе, чтобы получить токен и проанализировать его.

пройти черезgetTokenВы также можете настроить некоторую логику синтаксического анализа, например, использовать другие поля заголовка, настраиваемые исключения и т. д.:

app.use(expressJwt({
  secret: 'secret12345',
  credentialsRequired: false,
  getToken: function fromHeaderOrQuerystring (req) {
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
      return req.headers.authorization.split(' ')[1]
    } else if (req.query && req.query.token) {
      return req.query.token
    }
    return null
  }
}))

Отозвать токен

В механизме JWT, поскольку токены обычно не хранятся, если вы хотите отозвать токен, это обычно делается пассивным способом.

Обычный способ — создать черный список поля (например, TokenId) и отфильтровать все токены. Express-jwt предоставляет обратный вызов для решения этой ситуации:

const expressJwt = require('express-jwt')
const blacklist = require('./blacklist')

let isRevokedCallback = function(req, payload, done){
  let issuer = payload.iss
  let tokenId = payload.jti

  blacklist.getRevokedToken(issuer, tokenId, function(err, token){
    if (err) { return done(err) }
    return done(null, !!token)  // 第二个参数为 true 则不通过
  })
}

app.use(expressJwt({
  secret: 'secret12345',
  isRevoked: isRevokedCallback
}))

Больше использования можно посмотретьофициальная документация


Эта статья относится к оригинальному контенту, впервые опубликованному в публичном аккаунте WeChat.программирование на всю жизнь», если вам нужно перепечатать, пожалуйста, оставьте сообщение на фоне официального аккаунта.

Подпишитесь и ответьте на следующую информацию для получения дополнительных ресурсов
Ответить на [Информация] Получить учебные ресурсы, такие как Python/Java
Ответить на [Плагины] Получить плагины Chrome, обычно используемые поисковыми роботами
Ответить на [Zhihu] Получить последнюю версию входа в симуляцию Zhihu