gpt4 book ai didi

javascript - 了解 Passport 、序列化失败、401 错误

转载 作者:行者123 更新时间:2023-11-30 20:53:28 24 4
gpt4 key购买 nike

我今天一直在修改 passport-jwt,试图找出如何在我的应用程序中正确设置它。我在注册用户和保存 jwt token 时没有遇到任何问题,但我认为我没有使用 Passport 来这样做。现在我尝试登录一个用户,但总是收到错误 Error: Failed to serialize user into session。我在许多文章中看到了以下内容:

passport.serializeUser((user, done) => {
done(null, user.id);
});

passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});

但我似乎找不到任何示例,甚至找不到解释在哪里使用这些的 Passport 文档的配置部分。这可能是我问题的根源,但我不确定。我觉得 Passport 令人困惑的一个方面是 JWT 提取器。如果我只想将我的 Passport 变成 jwt token 并将其保存在我的 mongo 数据库中,为什么我会需要它们中的任何一个(即使它们是必需的)?自己使用 jsonwebtoken 并根据需要散列/取消散列字符串并使用 cookie-parser 创建我自己的 session 而不是使用像 Passport 这样的东西会不会更容易?我还尝试在我的休息电话中使用 passport.authenicate() 但那些返回 401。您可以在登录调用下方看到注释掉的失败尝试。

请帮忙,我觉得我是唯一一个发现 Passport 比不那么可靠的 Passport 更复杂的人,但我真的致力于解决它!

import express from 'express';
import path from 'path';
import bodyParser from 'body-parser';
import connection from './database';
import jwt from 'jsonwebtoken';
import cors from 'cors';
import crypto from 'crypto';
import passport from "passport";
import passportJWT from "passport-jwt";
const JwtStrategy = passportJWT.Strategy;
const ExtractJwt = passportJWT.ExtractJwt;
import { User } from './schema';
import { read } from 'fs';
const app = express();
const corsOptions = {
origin: '*',
optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204
}
app.use(cors(corsOptions));
app.use(passport.initialize());
app.use(passport.session());

const jwtOptions = {
jwtFromRequest: ExtractJwt.fromBodyField('Password'),
secretOrKey: 'secretKey',
jsonWebTokenOptions: { expiresIn: 172800 }
}

passport.use(new JwtStrategy(jwtOptions, (jwt_payload, done) => {
User.findOne({ password: jwt_payload.sub }, (err, user) => {
user ? done(null, user) : done(null, false);
});
}));

passport.serializeUser((user, done) => {
done(null, user.id);
});

passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});

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

app.use(express.static(path.join(__dirname, 'build')));

app.get('/*', (req, res) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

app.post('/test', (req, res) => {
console.log('Success');
console.log(req.body);
res.json(req.body);
});

app.post('/register', async (req, res) => {
if (req.body.FirstName
&& req.body.LastName
&& req.body.Email
&& req.body.Password
) {
const token = await jwt.sign(
{ Password: req.body.Password },
jwtOptions.secretOrKey,
{ expiresIn: '48h' }
);
const CreatedAt = await Date.now();
const newUser = await new User({
FirstName: req.body.FirstName,
LastName: req.body.LastName,
Email: req.body.Email,
Password: token,

});
await newUser.save(err => {
err ? console.log(err) : res.json(newUser);
});
}
throw new('error');
});

// app.post('/login', passport.authenticate('jwt', { session: false }),
// (req, res) => {
// console.log(req.user)
// if (req.body.Email && req.body.Password) {
// User.findOne({ Email: req.body.Email }, (err, user) => {
// if (err) return console.log(err);
// console.log(user);
// return user;
// }).then((res) => {
// jwt.verify(res.Password, jwtOptions.secretOrKey, (err, decoded) => {
// err ? console.log(err) :
// req.login(decoded, (err) => {
// // if (err) { return next(err); };
// if (err) {
// console.log(err)
// } else {
// console.log(decoded)
// }
// });
// });
// }).catch(err => console.log('Failed ', err));
// } else {
// console.log(req.body);
// }
// });

app.post('/login', (req, res) => {
if (req.body.Email && req.body.Password) {
User.findOne({ Email: req.body.Email }, (err, user) => {
if (err) return console.log(err);
console.log(user);
return user;
}).then((res) => {
// res.password returns the jwt string successfully
jwt.verify(res.Password, jwtOptions.secretOrKey, (err, decoded) => {
err ? console.log(err) :
req.login(decoded, (err) => {
// if (err) { return next(err); };
if (err) {
console.log(err) // always returns the error posted above
} else {
console.log(decoded)
}
});
});
}).catch(err => console.log('Failed ', err));
} else {
console.log(req.body);
}
});

app.listen(9000, () => {
console.log(`Listening on port 9000`);
});

自定义提取器尝试

    const customExtractor = req => {
User.findOne({ Email: req.body.Email }, '_id', (err, user) => {
const token = jwt.sign(
{ id: user },
'secretKey',
{ expiresIn: '48h' }
);
return token;
});

根据@OrthoHomeDefense 的帖子,我创建了以下内容并成功向客户端发送了一个 jwt token :

app.post("/login", (req, res) => {
if (req.body.Email && req.body.Password) {
User.findOne({ Email: req.body.Email }, (err, user) => {
if(user.Password === req.body.Password) {
console.log()
var token = jwt.sign(JSON.stringify(user), jwtOptions.secretOrKey);
res.json({token: token});
} else {
console.log(err);
res.status(401).json({message:"Passwords did not match."});
}
});
} else {
res.status(401).json({message:"Please provide an email and a password."});
}
});

最佳答案

首先,@OrthoHomeDefense 解决了我最初关于设置登录的问题,因为我对初始设置需要遵循什么以及在哪里使用 Passport 感到困惑。

下面是我从客户端到服务器的调用。

export const test = token => {
console.log(token)
return dispatch => {
axios.post('http://localhost:9000/test',
{
headers: {'authorization': token},
data: {test: 'test', Token: token}
}
).then((res) => {
console.log(res.data);
})
.catch((error) => { console.log(error); });
}
}

接下来是我在服务端做了哪些相关的测试。

const customExtractor = req => {
let token = req.body.headers.authorization;
console.log(token);
return token;
}

const jwtOptions = {
jwtFromRequest: customExtractor,
secretOrKey: 'secretKey',
}

passport.use(new JwtStrategy(jwtOptions, (jwt_payload, done) => {
console.log('Success', jwt_payload);
User.findOne({id: jwt_payload.sub}, (err, user) => {
if (err) return done(err, false);
if (user) {
return done(null, user);
} else {
return done(null, false);
}
});
}));

我尝试了下面的提取器,但每次都收到 404,所以我创建了上面非常简单的提取器。如果您将 token 保存在 cookie 或类似的东西中,请在您自己的提取器中进行适当的编辑,因为我发现自己做起来更容易。

jwtFromRequest: ExtractJwt.fromBodyField('Token'),
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
jwtFromRequest: ExtractJwt.fromHeader("授权"),

关于javascript - 了解 Passport 、序列化失败、401 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915604/

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