我正在尝试根据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)
}
}
答案 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字段应包含自该纪元以来的秒数。
所以:
60
60 * 5
哪个给
// Expires in 5 minutes
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 5 * 60 })