为了账号安全,请及时绑定邮箱和手机立即绑定

护照-jwt总是返回未经授权的401

护照-jwt总是返回未经授权的401

慕娘9325324 2021-04-06 14:15:27
我正在尝试使用passport-jwt身份验证策略对nodejs api进行身份验证,但是它始终会引发401未经授权的错误。我尝试了各种实现,但是passport.authenticate函数似乎不起作用。使用以下护照版本:“ passport”:“ ^ 0.4.0”,“ passport-jwt”:“ ^ 4.0.0”,请在下面查看我的代码:尝试了以下选项:jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()  jwtFromRequest: ExtractJwt.fromHeader('authorization')  jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer')  jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('jwt')  但是没有用。尝试查看“ passport-jwt 401未经授权”以及其他链接以供参考。app.js文件:const express = require('express');const bodyParser = require('body-parser');const passport = require('passport');const cors = require('cors');const app = express();const login = require('./routes/login');app.use(cors());app.use(bodyParser.urlencoded({ extended: false }));app.use(bodyParser.json());// app.use(passport.initialize());app.use('/', login);app.listen(8000, () => console.log('Server running on http://localhost:8000/'));路由文件夹中的login.js文件:const express = require('express');const router = express.Router();const passport = require('passport');const passportref = require('./../controllers/passport');const loginController = require('./../controllers/loginController');router.post('/putemailregistration',loginController.putEmailregistration);router.get('/login', passportref.authenticate,loginController.verifyLogin);module.exports = router;Passport.js文件:const passport = require('passport');const JWTStrategy = require("passport-jwt").Strategy;const  ExtractJwt = require('passport-jwt').ExtractJwt;const models = require('./../models');const opts = {  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),  secretOrKey: 'incredible',}
查看完整描述

4 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

为了解决这个问题,您可以在中间件中进行管理


function authorized(request, response, next) {

    passport.authenticate('jwt', { session: false, }, async (error, token) => {

        if (error || !token) {

            response.status(401).json({ message: 'Unauthorized Message' });

        } 

        try {

            console.log('token',token)

            const user = await User.findOne(

                {_id: token._id}

            );

            request.user = user;

        } catch (error) {

            next(error);

        }

        next();

    })(request, response, next);   

}


router.get(

  '/',

  authorized,

  trimRequest.all,

  user.getItems

)


查看完整回答
反对 回复 2021-04-22
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

就我而言,我正在使用expiresIn环境变量中的值。环境变量的值将是String类型,如果我们将字符串值传递给expiresIn,它将以毫秒为单位。因此,值3600被转换为3秒,到我将令牌从登录响应复制到auth标头时,该令牌已过期。



查看完整回答
反对 回复 2021-04-22
?
BIG阳

TA贡献1859条经验 获得超6个赞

用 passport.use('jwt',new JWTStrategy({opts},verify_callback(){})passport.js


查看完整回答
反对 回复 2021-04-22
  • 4 回答
  • 0 关注
  • 415 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信