Here's my auth.mjs code:
import jwt from 'jsonwebtoken';
export function generateToken(userInfo){
if(!userInfo) {
return null;
}
const payload = { username: userInfo.username, exp: Math.floor(Date.now() / 1000) + 30};
const secret = Buffer.from(process.env.JWT_SECRET).toString('base64');
return jwt.sign(payload, secret, {algorithm: 'HS512'});
}
export async function verifyTokens(username, token) {
console.error("Still inside verifyTokens");
try{
console.error('Inside verifyToken');
const response = await new Promise((resolve, reject) => {
jwt.verify(token, Buffer.from(process.env.JWT_SECRET.toString('base64'), {algorithm: 'HS512'}, (err, decoded) => {
if (err) {
reject (err);
} else {
resolve(decoded);
}
})
)})
if (response.username !== username) {
console.error('response.username !== username');
return {
verified: false,
message: 'invalid user'
}
}
console.error('response.username === username');
return {
verified: true,
message: 'verified'
}
} catch (error) {
console.error('Verified Tokens Error: ' + error);
throw {
verified: false,
message: 'invalid token'
}
}
}
export default generateToken;
Here's my verify.mjs code:
import buildResponse from '../utils/util.mjs';
import verifyTokens from '../utils/auth.mjs';
export async function verify(requestBody) {
if(!requestBody.user || !requestBody.user.username || !requestBody.token) {
return buildResponse(401, {
verified: false,
message: 'incorrect request body'
})
}
const user = requestBody.user;
const token = requestBody.token;
try {
console.error("Verifying this token=" + token);
console.error("Verifying this user.username=" + user.username);
const verification = await verifyTokens(user.username, token);
console.error('Are we verified? verification.verified=', verification.verified);
if(!verification.verified) {
console.error("We are NOT verified! verification.verified=", verification.verified)
return await buildResponse(401, verification);
}
}
catch (error) {
console.error("Error: ", error);
}
return buildResponse(200, {
verified: true,
message: 'success',
user: user,
token: token
})
}
export default verify;
The log files show that I get to "Verifying this token" and "Verifying this user.username", but the log files never show the "Still inside verifyTokens" so I don't think it's calling this line.
const verification = await verifyTokens(user.username, token);

Explanation:
As per MSN docs:
You are already exporting multiple named exports such as
generateTokenandverifyTokenswithin yourauth.mjsusing Export Declarations when you used this syntax:This means it can be confusing to also use
export defualtsyntax like you have done here in the same file:Typically, using
export defualtis for when you want to export a single variable, function or class. The knock-on effect in your code means that when you do this:The
verifyTokensvariable you just created now actually points to thegenerateTokenfunction because you're now importing thedefault(which wasgenerateToken). This is import to understand because when you try to executeverifyTokens()here:What actually happened was this:
Solution:
Simply import
verifyTokensas one of the named exports using curly braces like so: