我目前正在尝试为我当前的项目设置oauth服务。作为这一切的新手,我读了很多关于这个主题的文章,但我仍然缺少一些内容。
我的环境是:
- 服务器:node、express、passport
- 身份验证:本地策略(使用我自己的帐户/密码(
- 我有一个带有用户/密码的数据库(密码通过bcrypt运行(
- web界面:react,服务器通过超级代理访问
在我的nodejs服务器上,我使用以下模块:
- 快递
- 快速会话
- express mysql会话
- 护照
- 本地护照
- bcrypt
解决方案的不同部分正在工作:我可以创建新用户,创建新会话,在express mysql会话数据库中查看他们的内容。
然而,我对以下内容感到困惑:
-
当我的web客户端试图访问受保护的路由时,我似乎在请求中没有得到任何cookie。是不是超级代理默认不会发送我的护照cookie?我在某个地方读到,在单页应用程序中,jwt可能更合适,这与这个问题有关吗?
-
尽管我读了这么多,但我仍然对deserializeUser感到困惑。我的理解是,使用passport本地解决方案,在访问时,web客户端将发送会话cookie,其中包含会话Id。passport将从数据库中获取有关该会话的进一步信息,然后继续处理请求。这个会话信息检索是自动进行的吗(在express-mysql会话中?(?还是必须在deserializeUser中"手动"执行(许多示例显示了其中的
User.findById
调用(?如果您必须"手动"访问express-mysql会话数据库,这意味着您必须使用该模块使用的连接之外的另一个连接来访问express-mysql会话db? -
要注销,req.logout((是否足以确保会话从会话数据库中完全删除?
到目前为止我找到的答案:
- 必须将
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,
}));
所有会话信息都由这些模块自动检索。然而,许多示例显示此调用将返回到用户数据库以获取更多信息(权限、其他信息(。目标是避免在两个位置(会话数据库和用户配置文件数据库(具有相同的信息,并避免这些信息不同步(当帐户关闭等(
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已丢失。