jsonwebtoken: expiresIn не истекает? - PullRequest
1 голос
/ 27 мая 2019

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

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.log(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)
  }
}

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Функция 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.log(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 принимает число в виде секунд или строковое описание времени от zeit / ms

{ expiresIn: 1 * 60 }
{ expiresIn: '1m' }
0 голосов
/ 27 мая 2019

Из документов написано, что

Это означает, что поле exp должно содержать количество секунд с начала эпохи.

Итак:

  • 1 минута => 60
  • 5 минут => 60 * 5

Что дает

// Expires in 5 minutes
jwt.sign({
  data: 'foobar'
}, 'secret', { expiresIn: 5 * 60 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...