javascript - 如何验证 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.
解决方案
我刚刚将我的“jsonwebtoken”npm 包降级为“jsonwebtoken”:“^8.5.1”,它对我有用。
*节点解决方案
推荐阅读
- reactjs - 反应如何在 componentDidMount 中使用 jquery-ui 可排序
- java - 如何使用动画从右到左连续移动视图?
- ios - UIDocumentInteractionController 不显示基于 UTI 的应用程序
- java - 我的 TCP 客户端-服务器模板做错了什么?
- linux - 使用 exec -a 更改 /proc/N/comm
- android - ArrayAdapter:搜索类名本身而不是用户
- c - 关于在链表末尾添加元素的问题
- python - 关于 Pymongo 多处理
- opencv - 从 2D 坐标获取 3D 坐标
- python - Python 解码和编码