passport本地cookie和会话数据库处理



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

我的环境是:

  • 服务器:node、express、passport
  • 身份验证:本地策略(使用我自己的帐户/密码(
  • 我有一个带有用户/密码的数据库(密码通过bcrypt运行(
  • web界面:react,服务器通过超级代理访问

在我的nodejs服务器上,我使用以下模块:

  • 快递
  • 快速会话
  • express mysql会话
  • 护照
  • 本地护照
  • bcrypt

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

然而,我对以下内容感到困惑:

  1. 当我的web客户端试图访问受保护的路由时,我似乎在请求中没有得到任何cookie。是不是超级代理默认不会发送我的护照cookie?我在某个地方读到,在单页应用程序中,jwt可能更合适,这与这个问题有关吗?

  2. 尽管我读了这么多,但我仍然对deserializeUser感到困惑。我的理解是,使用passport本地解决方案,在访问时,web客户端将发送会话cookie,其中包含会话Id。passport将从数据库中获取有关该会话的进一步信息,然后继续处理请求。这个会话信息检索是自动进行的吗(在express-mysql会话中?(?还是必须在deserializeUser中"手动"执行(许多示例显示了其中的User.findById调用(?如果您必须"手动"访问express-mysql会话数据库,这意味着您必须使用该模块使用的连接之外的另一个连接来访问express-mysql会话db?

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

到目前为止我找到的答案:

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

在CORS方面,在服务器上,如果使用"CORS"npm模块,则需要"凭据"选项,例如:

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

  2. req.logout()断开了会话,但会话信息仍保留在数据库中。下面的问题让我走上了正轨:如何在express+passport-js中删除注销时的cookie?。您需要使用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已丢失。

最新更新