Паспорт обычно используется для аутентификации токенов в 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