首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JsonWebTokenError: jwt必须是字符串

JsonWebTokenError: jwt必须是字符串
EN

Stack Overflow用户
提问于 2021-05-06 10:00:28
回答 2查看 4K关注 0票数 1

我试图在后端进行身份验证,以便只有正确的用户才能获得正确的数据。

App.js

代码语言:javascript
运行
复制
const express = require('express');
const app = express();
const {mongoose} = require('./db/mongoose');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken')

//load Middleware
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

//CORS Middleware
app.use(function(req, res, next) {
req.header("Content-Type: application/x-www-form-urlencoded");
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", " GET, POST, OPTIONS, PUT, PATCH, DELETE")
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, x-access-token, x-refresh-token");

res.header(
    'Access-Control-Expose-Headers',
    'x-access-token, x-refresh-token'
);

next();
})

为了实现我的目标,我创建了身份验证方法。

代码语言:javascript
运行
复制
//aunthenticate middleware
let authenticate = (res, req, next) => {
let token = res.header('x-access-token');

jwt.verify(token, User.getJWTSecret(), (err, decoded) => {
    if (err) {
        res.status(401).send(err);
        console.log(err)
    } else {
        req.user_id = decoded._id;
        next();
    }
})
}

我必须进入用户模型

代码语言:javascript
运行
复制
const { User } = require('./db/models/users.model');

关键是每个用户都应该有自己的调度记录。因此

代码语言:javascript
运行
复制
app.get('/dispatch', authenticate, (req, res) => {
    Dispatch.find({
      _userId: req.user_id
    }).then((dispatch) => {
      res.send(dispatch);
    }).catch((e) => {
      res.send(e);
    })
})

我们得到的所有提示都在

Users.model.js

代码语言:javascript
运行
复制
const mongoose = require("mongoose");
const _ = require("lodash");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const crypto = require("crypto")
const jwtSecret = "XXXXXXXXXXX";
const UserSchema = new mongoose.Schema({
email: {
    type: String,
    required: true,
    minlength: 1,
    trim: true,
    unique: true
},
password: {
    type: String, 
    required: true,
    minlength: 8
},
sessions: [{
    token: {
        type: String,
        required: true
    },
    expiresAt: {
        type: Number,
        required: true
    }
}]
});
//Model Methods
UserSchema.statics.getJWTSecret = () => {
  
  return jwtSecret;
}

const User = mongoose.model('User', UserSchema);

module.exports = { User };

当我运行get分派方法是postman时,我的终端上的错误是jsonwebtokenError: jwt必须是字符串

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-06 10:35:55

正如错误提示的那样,您的问题在于如何设置令牌,因为您所提供的值似乎不属于字符串类型。

现在,我看不到您用共享的代码设置令牌的位置,但是要解决这个问题,只需确保传递一个字符串化的值即可。

我建议你用toString来强迫它

代码语言:javascript
运行
复制
jwt.sign(jwtValue.toString(), jwtSecret, { expiresIn: '1800s' });

如果要存储对象,也可以使用字符串:

代码语言:javascript
运行
复制
jwt.sign(JSON.stringify(jwtValue), jwtSecret, { expiresIn: '1800s' });
票数 0
EN

Stack Overflow用户

发布于 2022-05-19 12:53:45

当您从完整对象提供的cookie中取出令牌时,您需要从cookie中提取令牌。这个错误也出现在我这里,如果您想要使用这个方法,因为您的代码和我的代码有点不同,您只需要从标头中获取令牌,而不需要从整个对象中获取标记,而且您的jwt_secret也是字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67415891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档