如何在Strapi中启用用户会话?针对/auth/local接口的配置咨询
我在几个Strapi v4项目里折腾过会话管理,刚好能给你分享下最实用的配置步骤和踩过的坑:
1. 先理清Strapi的会话基础
Strapi确实默认依赖koa-session,但默认配置里没有开启前端可接收的会话Cookie——毕竟它默认优先用JWT做身份验证。要启用会话,得从中间件和用户权限插件两个地方入手。
2. 配置全局会话中间件
首先找到项目根目录下的config/middlewares.js(旧版本可能是config/middleware.js),把strapi::session中间件的配置补全:
module.exports = [ 'strapi::errors', { name: 'strapi::session', config: { // 必须设置加密密钥,生产环境一定要存在环境变量里,别硬编码 secret: process.env.SESSION_SECRET || 'your-super-random-32-char-secret', cookie: { path: '/', // Cookie生效的路径,全局就设为/ httpOnly: true, // 禁止前端JS读取Cookie,更安全 // 生产环境必须开secure,配合HTTPS使用,不然浏览器可能拒绝保存Cookie secure: process.env.NODE_ENV === 'production', maxAge: 24 * 60 * 60 * 1000, // 会话有效期1天,按需调整 sameSite: 'lax', // 跨域场景可设为'none'(但要配合secure),同源用'lax'足够 }, }, }, 'strapi::cors', 'strapi::poweredBy', 'strapi::logger', 'strapi::query', 'strapi::body', 'strapi::favicon', 'strapi::public', ];
3. 让用户权限插件支持会话登录
因为你用的是/auth/local这个默认登录接口,属于users-permissions插件,得让它在登录成功时设置会话Cookie。修改config/plugins.js:
module.exports = { // 其他插件配置... 'users-permissions': { config: { // 如果你只想用会话,不想用JWT,可以把jwt.enabled设为false // 要是想同时支持JWT和会话,保持true就行,两者不冲突 jwt: { enabled: true, }, session: { enabled: true, // 关键:开启会话支持 // 这里可以单独配置会话Cookie的参数,不写就继承全局会话的配置 }, }, }, };
4. 验证会话是否生效
配置完重启Strapi,然后用Postman或者curl测试:
- 发送POST请求到
/auth/local,带上identifier和password - 看响应头里有没有
Set-Cookie字段,里面应该包含strapi_session(默认名称)的Cookie - 接下来发送GET请求到
/users/me,不用带Authorization头,只需要带上刚才的Cookie,应该能返回当前用户的信息,说明会话生效了
5. 生产环境必看的坑
- 会话存储:默认是内存存储,重启Strapi后所有会话都会丢失!生产环境一定要换成Redis或者数据库存储。比如用Redis的话,先安装
koa-redis,然后在会话配置里加store:const RedisStore = require('koa-redis'); module.exports = [ { name: 'strapi::session', config: { secret: process.env.SESSION_SECRET, store: new RedisStore({ host: process.env.REDIS_HOST, port: process.env.REDIS_PORT, password: process.env.REDIS_PASSWORD, }), cookie: { /* ... */ }, }, }, // ...其他中间件 ]; - 跨域场景:如果你的前端和Strapi不在同一个域名,要配置CORS允许携带Cookie。在
strapi::cors的配置里加credentials: true,同时前端请求要设置withCredentials: true(比如Axios里要加这个选项)。 - Secret安全:绝对不能把
SESSION_SECRET硬编码到代码里,一定要用环境变量(比如.env文件),而且密钥要足够长(至少32位随机字符串)。
内容的提问来源于stack exchange,提问作者Rishi
相关产品推荐
相关产品推荐

