javascript passport js会话不适用于Cors

8cdiaqws  于 2023-02-21  发布在  Java
关注(0)|答案(2)|浏览(100)

我在互联网上搜索了很多,但我找不到答案。
我在一个端口上使用前端,在另一个端口上使用后端。我使用cors来启用请求,这是有效的。但是当我使用mongodb whit实现passport js和sessions时,这意味着当我尝试使用req.user获取用户时,这是未定义的。下面是我的index.js代码

app.use(cors());
app.use(session({
resave: false,
saveUninitialized: false,
secret: 's3cr3et',
store: new MongoStore({
    url: process.env.MONGO_URI
})
}));
app.use(passport.initialize());
app.use(passport.session());

我的护照是

这里我定义了我的授权、序列化和反序列化用户。我的授权和序列化运行良好但反序列化不好

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

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

passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
  User.findOne({ email: email.toLowerCase() }, (err, user) => {
    if (err) { return done(err); }
    if (!user) { return done(null, false, { error: 'Invalid credentials.' }); }
    user.comparePassword(password, (err, isMatch) => {
      if (err) { return done(err); }
      if (isMatch) {
        return done(null, user);
      }
      return done(null, false, { error: 'Invalid credentials.' });
    });
  });
}));

我也试过cookie会话,而不是mongo db,但我想这不是解决办法。问题是cors,由于某种原因passport不读会话。
我还尝试在coors中启用凭据并指定源,但反序列化仍然没有设置用户

app.use(cors({
    credentials: true,
    origin: ['http://localhost:8080']
}));

我希望你能帮助我,因为我不能让它工作谢谢!!

pqwbnv8z

pqwbnv8z1#

我也有同样的问题。在我的情况下,我在前端做了一个水疗,有一个RESFful(嗯,实际上,我们在这里维护的不是状态)。后来我发现,当我向REST风格的API发出请求时,我没有将浏览器cookie与数据沿着发送。这正是问题所在,因为我们需要后端的cookie数据来找出哪个用户发送了特定的请求,所以不允许用户进行反序列化。试着做同样的事情,我希望这能像解决我的问题一样解决你的问题

pgky5nke

pgky5nke2#

这可能是Cross-Origin Resource Sharing(CORS)的问题,它是一种安全机制,用于防止未经授权的浏览器访问服务器上的信息。
服务器和客户端都必须选择加入才能允许CORS。

服务器选择加入

索引. js

我加上这个只是为了得到一个完整的答案。
origin: "http://localhost:8080"让服务器知道什么浏览器能够访问我们的信息。
credentials: true允许请求在CORS中包含Cookie,这也是我们让服务器选择加入的方式。

const corsOptions = {
  origin: "http://localhost:8080", // origin: ["http://localhost:8080"] works also
  credentials: true,
};
app.use(cors(corsOptions));

客户选择加入

credentials: "include"是我们让浏览器通过随请求沿着发送cookie来选择加入的方式。

await fetch("http://localhost:8080/login", {
        credentials: "include",
      })

相关问题