使用Node.js服务器使用express-mysql-session

首先

作为优化向量瓦片服务器的一部分,我们正计划将用于开发环境的内存会话存储替换成MySQL数据库。

环境

    • Cent OS Linux release 7.8.2003

 

    • nodejs ver. 16.13.1

 

    • npm ver. 8.1.2

 

    mysql Ver. 8.0.27 for Linux on x86_64 (MySQL Community Server – GPL)

步骤

步骤1:准备带有Azure AD认证的Node.js服务器。

我创建了一个Node.js/Express服务器。我参考了Microsoft的教程(使用Node.js Express构建Microsoft Graph应用程序)来使用msal进行Azure AD身份验证。(我在我的Microsoft帐户上注册了该应用程序的Azure AD)。

我在ubukawa/server-test-01创建了一个远程仓库,这件事我在之前的文章中提到过(抱歉内容有些杂乱无章)。

到目前为止的任务和方针

到目前为止,我们正在使用express-session,用户的保存是通过内存会话实现的,因此在生产环境中需要将其替换为适当的方法。msalClient也是通过locals进行管理的,但首先需要处理express-session的会话。考虑到数据库的简单性,我们决定使用express-mysql-session。

步骤2:安装mysql

为了让来自矢量瓦片服务器的用户管理数据库能够访问本地主机,我在服务器上安装了mysql。由于我的测试环境是CentOS,所以我非常参考以下内容并按照步骤进行了安装(非常感谢您)。

在CentOS7上安装并初始化MySQL的步骤。

然后,创建了一个专门的用户,并给予该用户创建数据库、添加、删除记录等所需的权限。在矢量切片服务器的相同环境中安装了mysql,并以本地主机连接的方式访问mysql数据库(但是,仅有这些是不够的。请参考第四步。)

步骤三:添加express-mysql-session。

如果仔细查看原始的app.js,我认为可以相对简单地将express-session替换为express-mysql-session。首先,添加express-mysql-session模块。

const session = require('express-session');
const MySQLStore = require('express-mysql-session')(session); //追加分

在使用Express-session处理会话的地方,指定了express-mysql-session作为会话存储(将密码和数据库名称放在.env文件中进行读取)。

//Session witl mysql (from here)////////////////////////
const mysqlOptions ={
  host: 'localhost',
  port: 3306,
  user: 'hoge',
  password: process.env.MYSQL_PASSWORD, 
  database: process.env.MYSQL_DATABASE
};

const sessionStore = new MySQLStore(mysqlOptions);
const sess = {
  secret: process.env.hoge,
  cookie: {maxAge: 60000000}, 
  store: new MySQLStore(mysqlOptions),
  resave: false,
  saveUninitialized: false
}

sess.cookie.secure = true; //for production
app.use(session(sess))
//Session witl mysql (until here)////////////////////////

/*
//もともとのセッション
app.use(session({
  secret: process.env.hoge,
  resave: false,
  saveUninitialized: false,
  unset: 'destroy'
}));
*/

我试着以这种方式运行了一下(在外部的训练服务器上进行实验,而不是本地主机)。
关于会话参数,最初我误解了cookie的maxAge单位是秒,导致会话很快就过期了,但后来我意识到应该是毫秒,所以进行了修正。至于resave和saveUninitialized,我会适当进行设置。

第四步:处理错误

然而,在服务器端出现了错误:“ER_NOT_SUPPORTED_AUTH_MODE:客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端。” 经过调查发现,似乎无法访问MySQL,因此为了从矢量瓦片服务器连接到MySQL,执行了以下命令。

ALTER USER '(決めたユーザー)'@'localhost' IDENTIFIED WITH mysql_native_password BY '(パスワード)';
flush privileges;

然后,将值输入到MySQL数据库中,作为会话存储,似乎基本上是正常工作的样子。

步骤五:仍然无法运行。

2021-12-24-mysql-1.png

据我所知,在某些会话中包含了useId的信息。当它适当地返回到auth.js的回调时,homeid将被记录为req.session.userId。(我注意到这个列表在第二天消失了,我想这可能是因为它被正确地清除了。)

2021-12-24-mysql-2.png

只是因为索引页面没有返回,所以我现在在确认中。
这可能不是会话的问题,而是我可能弄乱了回调和之后的首页渲染相关的东西。
(我还在继续工作,如果有进展我会追加的。)

使用Azure AD进行认证时,存在与范围(例如’user.read,calendars.readwrite,mailboxsettings.read’)相关的问题。
在使用内部Azure AD进行测试时,它成功了。

总结

我成功地将express-session中的sessionstore存储到了MySQL数据库中。

参考的页面等

    • Build Node.js Express apps with Microsoft Graph

 

    • CentOS7にMySQLをインストールして初期設定するまで

 

    • [Node.js][Express]セッションを使う

 

    MySQL 8.0 – Client does not support authentication protocol requested by server; consider upgrading MySQL client
广告
将在 10 秒后关闭
bannerAds