jsonwebtoken.sign() fails with expiresIn option set
Emily Wong
I need to get a token by signing a user ID with JWT:
var token = jwt.sign(accounts[request.headers.login].id, privateKey, {expiresIn: 60});Where id and privateKey are strings.
The error is Error: Uncaught error: "expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60.
If I remove options object at all, it works, but without options I need to set.
The issue seems to be simple but I don't know how to fix it, what am I doing wrong?
4 Answers
payload could be an object literal, buffer or string. Please note that exp is only set if the payload is an object literal.
1Set the payload as an object if you want to be able to set the expiresIn option
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
) 5 In my case, it was a wrong file name that was referencing the env variables.
technicianAuthSchema.methods.getSignedToken = async function() {
return jwt.sign( { id: this._id }, process.env.JWT_SECRET, { expiresIn: process.env.EXPIRE, } );};instead of this
technicianAuthSchema.methods.getSignedToken = async function() {
return jwt.sign( { id: this._id }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRE, } );};Wrong file name: expiresIn: process.env.EXPIRE
Correct file name: expiresIn: process.env.JWT_EXPIRE
I am also facing the same question.There is my answer.the initial code
const setToken = function (data) { return new Promise((resolve, reject) => { const token = jwt.sign( data , signkey, { expiresIn: "1d" }); resolve(token); });
};The first parameter(data) should be object or add braces({});the edited code
const setToken = function (data) { return new Promise((resolve, reject) => { const token = jwt.sign({ data }, signkey, { expiresIn: "1d" }); resolve(token); });
}; 2