Javascript I';当我的React和节点服务器不同(Firebase)时,我的Passport有问题,但当它们相同时,就没有问题(Heroku)
我已经使用heroku部署了我的React应用程序,Passport可以很好地进行身份验证,但是当我使用Firebase托管和功能时,我遇到了一些无法解决的问题。 登录我的应用程序会刷新页面,该页面会调用一个Javascript I';当我的React和节点服务器不同(Firebase)时,我的Passport有问题,但当它们相同时,就没有问题(Heroku),javascript,node.js,reactjs,firebase,passport.js,Javascript,Node.js,Reactjs,Firebase,Passport.js,我已经使用heroku部署了我的React应用程序,Passport可以很好地进行身份验证,但是当我使用Firebase托管和功能时,我遇到了一些无法解决的问题。 登录我的应用程序会刷新页面,该页面会调用一个useffect钩子来检查用户是否已登录 const handleAdminLogin = async (username, password, e) => { e.preventDefault(); await ADMIN.login(username, passwo
useffect
钩子来检查用户是否已登录
const handleAdminLogin = async (username, password, e) => {
e.preventDefault();
await ADMIN.login(username, password).then((res) => {
if (res.status === 200) {
console.log(res);
window.location.reload();
}
});
};
useEffect(() => {
ADMIN.getUser().then((res) => {
console.log("success");
if (res) {
setUser({
id: res.data.id,
loggedIn: true,
});
}
});
}, []);
服务器发送状态200,因此接收请求时没有错误
login: function (req, res, next) {
passport.authenticate("local", (err, user, info) => {
if (err) throw err;
if (!user) res.sendStatus(401);
else {
req.logIn(user, (err) => {
if (err) throw err;
res.sendStatus(200);
});
}
})(req, res, next);
},
module.exports = function (passport) {
passport.use(
// eslint-disable-next-line new-cap
new localStrategy((username, password, done) => {
User.findOne({ username: username }, (err, user) => {
if (err) throw err;
if (!user) return done(null, false);
bcrypt.compare(password, user.password, (err, result) => {
if (err) throw err;
if (result === true) {
return done(null, user);
} else {
return done(null, false);
}
});
});
})
);
passport.serializeUser((user, cb) => {
cb(null, user.id);
});
passport.deserializeUser((id, cb) => {
User.findOne({ _id: id }, (err, user) => {
const userInformation = {
username: user.username,
};
cb(err, userInformation);
});
});
};
但这就是它停止的地方。函数getUser没有得到响应。
我知道在这种情况下我没有正确地处理错误,所以关于这方面的建议可能也会有所帮助
getUser: function (req, res) {
if (req.user) {
User.findOne({ username: req.user.username }).then((dbUser) => {
res.send({
id: dbUser._id,
username: dbUser.username,
});
});
}
},
我相信我的axios呼叫具有正确的标题:
const URL = "https://us-central1-foothill-fitness.cloudfunctions.net/app";
const headers = {
"Access-Control-Allow_Origin": "https://foothillfitness.com",
"Content-Type": "application/json",
};
export default {
// Gets user info
getUser: function () {
return axios.get(
`${URL}/admin/user`,
{ withCredentials: true },
{ headers: headers }
);
},
// Log the user in
login: function (username, password) {
return axios.post(
`${URL}/admin/user/login`,
{ username, password },
{ withCredentials: true },
{ headers: headers }
);
},
我的passport中间件也可能导致问题,但在本地运行服务器时,我没有发现任何错误
login: function (req, res, next) {
passport.authenticate("local", (err, user, info) => {
if (err) throw err;
if (!user) res.sendStatus(401);
else {
req.logIn(user, (err) => {
if (err) throw err;
res.sendStatus(200);
});
}
})(req, res, next);
},
module.exports = function (passport) {
passport.use(
// eslint-disable-next-line new-cap
new localStrategy((username, password, done) => {
User.findOne({ username: username }, (err, user) => {
if (err) throw err;
if (!user) return done(null, false);
bcrypt.compare(password, user.password, (err, result) => {
if (err) throw err;
if (result === true) {
return done(null, user);
} else {
return done(null, false);
}
});
});
})
);
passport.serializeUser((user, cb) => {
cb(null, user.id);
});
passport.deserializeUser((id, cb) => {
User.findOne({ _id: id }, (err, user) => {
const userInformation = {
username: user.username,
};
cb(err, userInformation);
});
});
};
还有一些我输入的服务器端代码,试图消除一些CORS错误:
app.use(
cors({
origin: "http://localhost:3000", // "https://foothillfitness.com", // <-- location of the react app were connecting to
credentials: true,
})
);
app.use("*", function (req, res, next) {
// res.header("Access-Control-Allow-Origin", "https://foothillfitness.com");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Headers", "Content-Type");
res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
res.header("Access-Control-Allow-Credentials", true);
next();
});
// enable pre-flight
app.options("*", cors());
app.use(
科尔斯({
来源:“http://localhost:3000", // "https://foothillfitness.com“,//您在使用axios发送的标题中有一个输入错误。访问控制中有一个下划线-Allow\u Origin。将此更改为破折号,看看这是否解决了问题
关于错误处理,您可以添加.catch
和else
,如下所示:
getUser:function(请求、恢复){
如果(请求用户){
User.findOne({username:req.User.username})。然后((dbUser)=>{
res.send({
id:dbUser.\u id,
用户名:dbUser.username,
});
}).catch(错误=>{
抛出新错误(err)
});
}否则{
抛出新错误(“未提供用户”)
}
}
感谢您对此的回复!不幸的是,这并没有解决我的问题。由于添加了错误处理,我现在在控制台中收到一个状态代码500。您能分享错误吗?如果是来自。catch
的话,问题是与mongodbIt的连接出现了新的错误,因此很可能就是这种情况createError.js:16未捕获(承诺中)错误:请求失败,XMLHttpRequest.handleLoad(xhr.js:62)的结算(结算.js:17)处的createError(createError.js:16)处的状态代码为500
但是,我还有其他调用正在工作。只是Passport的设置方式不正确,或者这个特定调用不正常。这里弹出另一个错误xhr.js:177 GEThttps://us-central1-foothill-fitness.cloudfunctions.net/app/admin/用户500
我试图复制此内容,但失败。请检查您与mongodb的连接