node.js - 为什么这个 verifyToken 函数永远不会被调用?

标签 node.js token verify

这是我的 auth.mjs 代码:

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;

这是我的 verify.mjs 代码:

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;

日志文件显示我进入了“验证此 token ”和“验证此 user.username”,但日志文件从未显示“仍在 verifyTokens 内”,因此我认为它没有调用此行。

const verification = await verifyTokens(user.username, token);

enter image description here

最佳答案

说明:

根据 MSN docs :

Every module can have two different types of export, named export and default export. You can have multiple named exports per module but only one default export.

您已使用 Export Declarationsauth.mjs 中导出多个命名导出,例如 generateTokenverifyTokens当您使用此语法时:

export function generateToken(userInfo){
   //...
}

export async function verifyTokens(username, token) {
   //...
}

这意味着使用 export defualt 语法可能会令人困惑,就像您在同一文件中所做的那样:

export default generateToken;

通常,当您想要 export a single variable, function or class 时,可以使用 export defualt 。代码中的链式 react 意味着当您执行此操作时:

import verifyTokens from '../utils/auth.mjs';

您刚刚创建的 verifyTokens 变量现在实际上指向 generateToken 函数,因为您现在正在导入 default (这是 >生成 token )。理解这一点很重要,因为当您尝试在此处执行 verifyTokens() 时:

const verification = await verifyTokens(user.username, token);
console.error('Are we verified? verification.verified=', verification.verified);

实际发生的事情是这样的:

const verification = await generateToken(user.username, token); //< token was ignored becuase generateToken only takes one parameter
console.error('Are we verified? verification.verified=', verification.verified); //< verification.verified is undefined

解决方案:

只需使用大括号将 verifyTokens 导入为命名导出之一,如下所示:

import { verifyTokens } from '../utils/auth.mjs';

关于node.js - 为什么这个 verifyToken 函数永远不会被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77338424/

相关文章:

javascript - Node.js worker_threads 模块是真正的线程还是只是带有 IPC 的进程?

android - 在 Android 上为 Stripe 服务创建服务器端

node.js - Nodemailer/Gmail - 究竟什么是刷新 token ,我如何获得一个?

vb.net - "Pinging"使用 VB.Net 编码的电子邮件地址

node.js - 转码和流式音频 - 如何发送内容范围 header

javascript - 使用 socket.IO 时如何让 console.log 在浏览器中工作?

javascript - 如何使用 JavaScript 动态替换 SQL 查询的一部分

go - oauth2 无法获取 token : bad request

java - JUnit:如何检查一个方法是否调用另一个方法?

php - password_verify 和 doveadm pw -t 如何在不加盐的情况下验证密码