passport-local cookie 和 session 数据库处理

passport-local cookie and session database handling

我目前正在尝试为我当前的项目设置一个 oauth 服务。作为这一切的新手,我已经阅读了很多关于这个主题的文章,但我仍然遗漏了一些内容。

我的环境是:

在我的 nodejs 服务器上,我正在使用这些模块:

解决方案的不同部分正在发挥作用:我可以创建新用户,创建新的 sessions,在 express-mysql-session 数据库中查看他们的内容。

但是我对以下内容很困惑:

  1. 当我的 Web 客户端尝试访问受保护的路由时,我似乎没有在请求中获取任何 cookie。默认情况下,超级代理不会发送我的护照 cookie 吗?我在某处读到,在单页应用程序中,jwt 可能更合适,是否与此问题有关?

  2. 尽管我阅读了所有内容,但我仍然对 deserializeUser 感到困惑。我的理解是,使用 passport-local 解决方案,在访问时,Web 客户端将发送 session cookie,其中包含 session Id。 Passport 将从数据库中获取有关此 session 的更多信息,然后继续处理请求。此 session 信息检索是否自动发生(在 express-mysql-session 中?)?或者您是否必须 "manually" 在 deserializeUser 中执行此操作(许多示例显示其中的 User.findById 调用)?如果你必须这样做 "manually",这意味着你必须使用另一个连接而不是这个模块正在使用的连接来访问 express-mysql-session 数据库?

  3. 注销,req.logout() 是否足以确保 session 从 session 数据库中完全删除?

目前我找到的答案:

  1. 必须将 withCredential 方法添加到 superagent,才能让它发送身份验证 cookie:
    res = await superagent
      .get(url)
      .withCredentials()
      .send();

在 CORS 方面,在服务器上,如果使用 'cors' npm 模块,则需要 'credentials' 选项,例如:

app.use(cors({
  origin: ['http://localhost:3003'],
  methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
  credentials: true,
}));
  1. 这些模块会自动检索所有会话信息。但是,许多示例显示此调用返回到用户数据库以获取更多信息(权限、其他信息)。目标是避免在两个位置(会话数据库和用户配置文件数据库)拥有相同的信息,并避免这些信息不同步(当帐户关闭等时...)

  2. req.logout() 断开会话,但会话信息会保留在数据库中。 以下问题使我走上了正确的轨道:。您需要使用 req.logout、res.session.destroy,并在使用 res.clearCookie 时删除客户端 cookie:

router.post('/logout/',
  (req, res) => {
    req.logout();
    res.status(200).clearCookie('connect.sid', {
      path: '/',
      secure: false,
      httpOnly: false,
      domain: 'place.your.domain.name.here.com',
      sameSite: true,
    }).end();
    req.session.destroy();
  },

会话断开,数据库清理,cookie 消失。