jsonwebtoken.sign() 失败并设置了 expiresIn 选项

Posted

技术标签:

【中文标题】jsonwebtoken.sign() 失败并设置了 expiresIn 选项【英文标题】:jsonwebtoken.sign() fails with expiresIn option set 【发布时间】:2016-05-09 22:50:06 【问题描述】:

我需要通过使用JWT 签署用户 ID 来获取令牌:

var token = jwt.sign(accounts[request.headers.login].id, privateKey, expiresIn: 60);

其中idprivateKey 是字符串。

错误是Error: Uncaught error: "expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60。 如果我完全删除选项对象,它可以工作,但没有我需要设置的选项。

问题似乎很简单,但我不知道如何解决,我做错了什么?

【问题讨论】:

【参考方案1】:

如果您希望能够设置expiresIn 选项,请将有效负载设置为对象

var token = jwt.sign(
    id: accounts[request.headers.login].id, // object and not string
    privateKey,
    expiresIn: '60d' // added days, default for ex 60 would be ms, you can also provide '1h' etc
)

【讨论】:

"请务必提供时间单位(天、小时等),否则默认使用毫秒单位" 这将是 60 毫秒而不是 60 秒 @Seb 请编辑我的答案!以提供单位为例;) 我从 *** 收到“建议的编辑队列已满”错误 有效负载!!!!需要和对象(涌出多么糟糕的错误消息), 还有:60d 应该是 '60d'【参考方案2】:

在我的例子中,引用环境变量的文件名错误。

technicianAuthSchema.methods.getSignedToken = async function() 
return jwt.sign(  id: this._id , process.env.JWT_SECRET,  expiresIn: process.env.EXPIRE,  );;

而不是这个

technicianAuthSchema.methods.getSignedToken = async function() 
return jwt.sign(  id: this._id , process.env.JWT_SECRET,  expiresIn: process.env.JWT_EXPIRE,  );;

错误的文件名:expiresIn:process.env.EXPIRE 正确的文件名:expiresIn:process.env.JWT_EXPIRE

【讨论】:

【参考方案3】:

https://www.npmjs.com/package/jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback

payload 可以是对象文字、缓冲区或字符串。 请注意,仅当有效负载是对象文字时才会设置 exp。

【讨论】:

哦,如果有效负载是字符串,我似乎无法设置过期日期。谢谢!

以上是关于jsonwebtoken.sign() 失败并设置了 expiresIn 选项的主要内容,如果未能解决你的问题,请参考以下文章

循环引用阻止 jsonwebtoken.sign JSON.stringify 的原因

音频单元,设置格式失败并显示 -10581

为啥 Ambari 集群设置在 zookeeper 安装时失败并出现符号链接错误?

设置“Fastest -O”优化时,编译失败并显示有效代码

CakePHP 保存失败并设置了验证错误但为空

Apache Tiles 失败并出现错误,但仅当日志级别设置大于 INFO 时?