【问题标题】:Node Express JWT invalid tokenNode Express JWT 无效令牌
【发布时间】:2020-04-19 15:03:10
【问题描述】:

在本地工作,但在运行 prod build 时,出现 401 错误。不知道我错过了什么。每当我尝试调用应用程序中的任何 api 时,我都会收到 {message: "Invalid Token"}Server.js

require('rootpath')();
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
const jwt = require('./_helpers/Jwt');
const errorHandler = require('_helpers/Error-handler');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cors());

// use JWT auth to secure the api
app.use(jwt());

// api routes
app.use('/users', require('./users'));

// global error handler
app.use(errorHandler);

// start server
const port = process.env.NODE_ENV === 'production' ? (process.env.PORT || 80) : 4000;
if (process.env.NODE_ENV === 'production') {
    app.use(express.static('../portal/dist'));
    app.get('*', (req, res) => {
        res.sendFile(path.join(__dirname, 'portal', 'dist', 'index.html'))
    })
}
const server = app.listen(port, function () {
    console.log('Server listening on port ' + port);
});

JWT.js

const expressJwt = require('express-jwt');
const config = require('../config.json');
const userService = require('../users/user.service');

module.exports = jwt;

function jwt() {
    const secret = app.set('JWT_TOKEN', (process.env.JWT_TOKEN))    ;
    return expressJwt({ secret  }).unless({
        path: [
            // public routes that don't require authentication
            '/users/authenticate',
            '/users/register'
        ]
    });
}

async function isRevoked(req, payload, done) {
    const user = await userService.getById(payload.sub);

    // revoke token if user no longer exists
    if (!user) {
        return done(null, true);
    }

    done();
};

错误处理程序.js

module.exports = errorHandler;

function errorHandler(err, req, res, next) {
    if (typeof (err) === 'string') {
        // custom application error
        return res.status(400).json({ message: err });
    }

    if (err.name === 'ValidationError') {
        // mongoose validation error
        return res.status(400).json({ message: err.message });
    }

    if (err.name === 'UnauthorizedError') {
        // jwt authentication error
        return res.status(401).json({ message: 'Invalid Token' });
    }

    // default to 500 server error
    return res.status(500).json({ message: err.message });
}

config.js

{
    "secret": "Gu_*s+dF]x$E~n2B:#FwS.&Y;#M:sLMQ"
}

将拦截器添加到应用模块中。不确定我是否遗漏了什么。

【问题讨论】:

  • 在 jwt.js 文件中
  • secretL 变量在哪里定义?
  • 在配置文件中
  • secretL ?
  • 那只是拼写错误

标签: node.js express jwt-auth express-jwt


【解决方案1】:

您需要向 jwt 实例提供 isRevoked

return expressJwt({ secret, isRevoked })

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 2016-02-24
    • 2021-09-25
    • 2019-03-19
    • 2018-07-14
    • 2016-10-20
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多