首页 > 解决方案 > 如何验证 JsonWebtoken 错误“SyntaxError: Unexpected token n JSON at position 75”?

问题描述

我正在为用户注册编写逻辑,并且我想强制用户在将数据保存到数据库之前验证电子邮件。这个想法是生成一个 JSON Web 令牌并在用户注册时将其发送到客户端。然后我发送一封带有验证链接的电子邮件,并从客户端发送的标头或查询参数中提取 JSON 令牌。一切正常,但是当我运行 jwt.verify() 时,它只有在令牌正确的情况下才有效。出于测试目的,如果我尝试调整令牌它不起作用,这是期望的结果。但是,它不允许我向用户发送响应,在这种情况下,它只会引发错误“SyntaxError: Unexpected token n JSON at position 75”,但只有在令牌正确时才有效。是我的 Javascript 逻辑有问题还是 jsonwebtokens 是这样工作的?

助手.js

export default class Helper {
    constructor(){};

    /** generate jwt token */
    async generateToken (user) {
        return new Promise ( async (resolve, reject) => {
          const token = await jwt.sign(user, config.jwtSecret);
          if(!token) {
              reject();
              console.log('Failed to generate Jwt token')
            }
          if(token) {
              resolve(token);
            }
            else {
                reject();
                console.log('Somthing went wrong generating jwt token')
            }
        })

      }

    /** verify token */
    async verifyToken (token) {
        return new Promise ( async (resolve, reject) => {
            const isVerified = await jwt.verify(token, config.jwtSecret);
            if(!isVerified) {
                reject();
                console.log('Failed to verify jwt token')
            }
            if(isVerified) {
                resolve(isVerified);
            }
            else {
                reject();
                console.log('Error')
            }
        })
    }

    /** generate random string */
    async generateRanStr () {
        return crypto.randomBytes(20);
    }
}

路由.js

import express from 'express';
import Helper  from '../helpers/helpers';
import { Database } from '../database/db';
const Stylist = require('../models/stylist');

const router = module.exports = express.Router();

/** @POST Register new stylist */
router.post('/register', (req, res, next) => {
  /** validate user registration input */
  Stylist.validateInput().validate(req.body, async (err, user) => {
    if(err || !user) {
      return res.status(400).json({message: err.message})
    }
    if(user) {
      /** generate link token */
      const helper = new Helper();
      const token = await helper.generateToken(user);
      if(!token) {
        console.log('Failure to generate JWT Token');
        return res.status(500).json({ message: 'Internal server error' });
      }
      if(token){
        const emailSent = await Stylist.sendVerificationEmail(user.email, token);
        if(!emailSent) {
          console.log('Unable to send verification email');
          return res .status(500).json({ message: 'Internal server error...' })
        }if(emailSent) {
          res.status(200).json({ message: 'Please check your email for verification link', key: token });
        }
      }
    }
  });
});

/** @POST Verify new stylist registration */
router.post('/verify', async (req, res, next) => {
  console.log(req.query.key)
  /** verify token */
  const helper = new Helper();
  helper.verifyToken(req.query.key).then((verified) => {
    res.json(verified)
  }).catch((err) => {
    res.json(err.message)
  })

});

控制台中的错误

Application running...
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiQ2xlYXJtaW5kIiwiZW1haWwiOiJjY2hldGVrd2VAZ21haWwuY29tIiwic3BlY2lhbHR5IjoiTm9kZS5qcyBZXZlbG9wZXIiLCJpYXQiOjE1NjgxOTgyMzF9.ZpKu_S4P9sOkFmzGD04ZIvbNJ8IFRXA80MT-kqC6ijQ
(node:8768) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token n JSON at position 75
    at JSON.parse (<anonymous>)
    at Object.jwsDecode [as decode] (C:\Users\Tasman\Desktop\Project\beautify\node_modules\jws\lib\verify-stream.js:71:20)
    at module.exports (C:\Users\Tasman\Desktop\Project\beautify\node_modules\jsonwebtoken\decode.js:5:21)
    at Object.module.exports [as verify] (C:\Users\Tasman\Desktop\Project\beautify\node_modules\jsonwebtoken\verify.js:69:20)
    at _callee3$ (C:\Users\Tasman\Desktop\Project\beautify\dist\helpers\helpers.js:123:61)
    at tryCatch (C:\Users\Tasman\Desktop\Project\beautify\node_modules\@babel\runtime\node_modules\regenerator-runtime\runtime.js:45:40)
    at Generator.invoke [as _invoke] (C:\Users\Tasman\Desktop\Project\beautify\node_modules\@babel\runtime\node_modules\regenerator-runtime\runtime.js:271:22)
    at Generator.prototype.<computed> [as next] (C:\Users\Tasman\Desktop\Project\beautify\node_modules\@babel\runtime\node_modules\regenerator-runtime\runtime.js:97:21)
    at asyncGeneratorStep (C:\Users\Tasman\Desktop\Project\beautify\node_modules\@babel\runtime\helpers\asyncToGenerator.js:3:24)
    at _next (C:\Users\Tasman\Desktop\Project\beautify\node_modules\@babel\runtime\helpers\asyncToGenerator.js:25:9)
    at C:\Users\Tasman\Desktop\Project\beautify\node_modules\@babel\runtime\helpers\asyncToGenerator.js:32:7
    at new Promise (<anonymous>)
    at C:\Users\Tasman\Desktop\Project\beautify\node_modules\@babel\runtime\helpers\asyncToGenerator.js:21:12
    at C:\Users\Tasman\Desktop\Project\beautify\dist\helpers\helpers.js:149:34
    at new Promise (<anonymous>)
    at _callee4$ (C:\Users\Tasman\Desktop\Project\beautify\dist\helpers\helpers.js:111:51)
(node:8768) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:8768) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

标签: javascriptnode.jsjwt

解决方案


我刚刚将我的“jsonwebtoken”npm 包降级为“jsonwebtoken”:“^8.5.1”,它对我有用。

*节点解决方案


推荐阅读