gpt4 book ai didi

javascript - passport-jwt 总是返回 401 unauthorized

转载 作者:行者123 更新时间:2023-12-02 20:02:18 31 4
gpt4 key购买 nike

我正在尝试使用 passport-jwt 身份验证策略对 nodejs api 进行身份验证,但它总是抛出 401 未经授权的错误。我尝试了各种实现,但 passport.authenticate 函数似乎不起作用。

使用以下 Passport 版本:
"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 Unauthorized以及其他引用链接。

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/'));

route文件夹下的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',
}
passport.use(new JWTStrategy(opts,async (payload, done) => {
try {
console.log(`inside jwt strategy func`);
const user = models.Userabout.findById({
where: { email: { [Op.eq]: payload.email } },
attributes: ['id', 'email', 'password'],
});
console.log(`value of user: ${user}`);
if (typeof user !== 'undefined' && user !== null) {
return done(null, user);
}
else {
return done(null, false);
}
} catch (err) {
done(err, false);
}
}));


module.exports = {
initialize: () => passport.initialize(),
authenticate: passport.authenticate("jwt", { session: false }),
};

loginController.js 文件:

const { Op } = require('sequelize');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const models = require('./../models');
const saltRounds = 10;

module.exports.putEmailregistration = async (req, res) => {
try {
console.log(`inside put email registration`);

if (req.body.email === null || req.body.password === null) {
res.sendStatus(400).json('no data');
} else {
const emailregister = await models.Userdata.create({
email: req.body.email,
password: bcrypt.hashSync(req.body.password,
bcrypt.genSaltSync(saltRounds)),
});
const tokenid = jwt.sign({
id: emailregister.id,
email: emailregister.email,
}, process.env.JWT_SECRETKEY,
{ expiresIn: 3600 });
res.json({ success: true, token: 'bearer ' + tokenid });
}
} catch (err) {
console.log(`error at put email registration: ${err}`);
}
}


module.exports.verifyLogin = (req, res) => {
console.log(`i managed to get here`);

// console.log(`user: ${req.user}`);
// res.send(req.user.email);
}

最佳答案

经过多次调试,我终于解决了这个问题。希望这可能对某人有所帮助

  1. 我错误地指出了 passport.js 文件中的错误模型。它是 Userdata 而不是 Userabout。
  2. 在 loginController.js 文件中,我更改如下:
    const payload = { id: emailregister.id }
    const token = jwt.sign(payload, jwtOptions.secretOrKey);
  3. 使用以下选项效果很好。
    jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('Bearer');

关于javascript - passport-jwt 总是返回 401 unauthorized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55572786/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com