Я пытаюсь установить срок действия токена через час, следуя примеру из гид:
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 })
Но токе никогда не истекает через несколько часов:
curl -XGET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNTU4OTAzMDI3LCJleHAiOjE1NTg5MDY2Mjd9.8uHKDM4Hgy08kw_0CLib2QnzqudeC_RsIlh8e9uURT0' 'http://localhost:3000/api/users'
Я что-то упустил?
Как установить срок действия через 1 или 5 минут?
Код для проверки токена:
import jwt from 'jsonwebtoken'
import config from '../config'
export default async (ctx, next) => {
try {
await next()
if (ctx.req.hasOwnProperty('headers') && ctx.req.headers.hasOwnProperty('authorization')) {
ctx.req.user = jwt.verify(ctx.req.headers['authorization'], config.JWT_SECRET, function (err, payload) {
console.info(payload)
})
} else {
// If there is no autorization header, return 401 status code.
ctx.throw(401, 'Protected resource, use Authorization header to get access')
}
} catch (err) {
ctx.status = err.status || 500
ctx.type = 'json'
ctx.body = {
status: ctx.status,
message: err.message
}
ctx.app.emit('error', err, ctx)
}
}
@Matt Я обновил свой вопрос кодом, который использую для проверки токена. Посмотри.
Из документы говорится, что
This means that the exp field should contain the number of seconds since the epoch.
Так:
60
60 * 5
Который дает
// Expires in 5 minutes
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 5 * 60 })
Функция jwt.verify
в примере кода вопроса использует функцию обратного вызова для возврата асинхронного результата.
Koa основан на обещаниях и не будет получать этот результат обратного вызова или какие-либо возникающие ошибки (включая TokenExpiredError
). Проверка err
на данный момент полностью игнорируется.
jwt.verify
можно преобразовать в обещание, или если вы не укажете аргумент обратного вызова, функция вернется синхронно. После этого try
/catch
будут работать как положено.
import util from 'util'
import jwt from 'jsonwebtoken'
import config from '../config'
export const verifyPromise = util.promisify(jwt.verify)
export default async function verifyToken(ctx, next){
if (!ctx.req.hasOwnProperty('headers') || !ctx.req.headers.hasOwnProperty('authorization')) {
return ctx.throw(401, 'Protected resource, use Authorization header to get access')
}
try {
let payload = await verifyPromise(ctx.req.headers['authorization'], config.JWT_SECRET, {})
console.info(payload)
}
catch (err) {
if (err.name === 'TokenExpiredError'){
return ctx.throw(401, 'Protected resource, token expired')
}
console.error(err)
return ctx.throw(500, 'Protected resource, token error')
}
await next()
}
Функция jwt.sign
принимает число в виде секунд или строковое описание времени из время/мс.
{ expiresIn: 1 * 60 }
{ expiresIn: '1m' }
Спасибо за ответ. Я протестировал токен с koa-jwt
, срок действия работает нормально, но jsonwebtoken
определенно более гибкий. Спасибо! :-)
Выглядит нормально. Какой код вы используете для проверки токена?