jsonwebtoken:expiresIn不会过期吗?

时间:2019-05-27 00:37:15

标签: node.js jwt

我正在尝试根据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 个答案:

答案 0 :(得分:1)

问题代码示例中的jwt.verify函数正在使用回调函数返回其异步结果。

Koa基于承诺,不会获取此回调结果或捕获任何引发的错误(包括 let path = "/var/mobile/Containers/Data/Application/0595DE63-AE43-4DCF-9BD0-FB552844ECF5/Documents/tour15/H25.jpg" print("A",hotspotImage.image!.size) hotspotImage.image = hotspotImage.image!.resizeImage(2048, opaque: true) print("B",hotspotImage.image!.size) let fileManager = FileManager.default try! fileManager.removeItem(atPath: path) try! hotspotImage.image!.jpegData(compressionQuality: 0.8)!.write(to: URL(fileURLWithPath: path), options: [.atomic]) print("C",hotspotImage.image!.size) let imageTest = UIImage(contentsOfFile: path) print("D",imageTest!.size) )。验证TokenExpiredError目前已被完全忽略。

可以将

err转换为Promise,或者如果不提供callback参数,则该函数将同步返回。 jwt.verify / try将按预期工作。

catch

jwt.sign函数从zeit/ms开始以秒为单位表示数字或时间的字符串描述

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()

}

答案 1 :(得分:0)

docs中说

  

这意味着exp字段应包含自该纪元以来的秒数

所以:

  • 1分钟=> 60
  • 5分钟=> 60 * 5

哪个给

// Expires in 5 minutes
jwt.sign({
  data: 'foobar'
}, 'secret', { expiresIn: 5 * 60 })