如何在NextAuth中用Redis存储用户会话?(Express用户求助)
问题描述
之前使用Express框架,从未接触过NextAuth,不清楚如何将用户会话存储到Redis数据库中。
在Express中的实现方式如下:
import express from 'express'; import session from 'express-session'; import connectRedis from 'connect-redis'; import Redis from 'ioredis'; import { __prod__, COOKIE_NAME } from './constants'; const main = async () => { const RedisStore = connectRedis(session); const redis = new Redis(process.env.REDIS_URL); app.use( session({ name: 'qid', store: new RedisStore({ client: redis, disableTouch: true, ttl: 1000 * 60 * 60 * 24 * 365, // 1 year }), cookie: { maxAge: 1000 * 60 * 60 * 24 * 365, // 1 year httpOnly: true, sameSite: 'lax', secure: __prod__, domain: __prod__ ? process.env.DOMAIN : undefined, }, saveUninitialized: false, secret: process.env.SESSION_SECRET, resave: false, }), ); }; main()
当前的[...nextauth].ts代码:
import NextAuth, { type NextAuthOptions } from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; import { PrismaAdapter } from "@next-auth/prisma-adapter"; import { prisma } from "../../../server/db/client"; export const authOptions: NextAuthOptions = { callbacks: { session({ session, user }) { if (session.user) { session.user.id = user.id; } return session; }, }, adapter: PrismaAdapter(prisma), providers: [ CredentialsProvider({ async authorize(credentials, req) { // }, }), ], }; export default NextAuth(authOptions);
找不到NextAuth中使用Redis存储会话的实现方案,仅能找到使用Upstash进行缓存的相关内容,而非用于会话存储。
解决方案
NextAuth 默认通过配置的适配器(比如你用的Prisma Adapter)存储会话,要改用Redis存储会话,可以借助官方适配的Redis适配器实现,具体步骤如下:
1. 安装依赖
先安装Redis客户端和NextAuth的Redis适配器:
npm install ioredis next-auth-redis-adapter # 或使用yarn yarn add ioredis next-auth-redis-adapter
2. 修改[...nextauth].ts配置
替换原有数据库适配器,添加Redis客户端实例,并对齐你Express项目中的会话、Cookie配置:
import NextAuth, { type NextAuthOptions } from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; import { RedisAdapter } from "next-auth-redis-adapter"; import Redis from "ioredis"; import { __prod__ } from "../../../constants"; // 导入你的环境常量 // 创建Redis客户端实例 const redis = new Redis(process.env.REDIS_URL!); export const authOptions: NextAuthOptions = { // 替换为Redis适配器,将会话数据存储到Redis adapter: RedisAdapter(redis), callbacks: { session({ session, user }) { if (session.user) { session.user.id = user.id; } return session; }, }, session: { strategy: "database", // 使用Redis适配器时保持此配置,适配器会处理Redis存储逻辑 maxAge: 365 * 24 * 60 * 60, // 会话有效期1年,和Express配置一致 }, cookies: { sessionToken: { name: "qid", // 保持和Express中一致的Cookie名称 options: { httpOnly: true, sameSite: "lax", secure: __prod__, domain: __prod__ ? process.env.DOMAIN : undefined, maxAge: 365 * 24 * 60 * 60, // Cookie有效期1年 }, }, }, providers: [ CredentialsProvider({ async authorize(credentials, req) { // 保留你原有的授权逻辑 }, }), ], secret: process.env.SESSION_SECRET, // 必须配置,和Express项目中的密钥一致 }; export default NextAuth(authOptions);
额外说明
next-auth-redis-adapter会将用户、会话、账户等数据全部存储到Redis,替代原有的Prisma数据库存储。如果只想用Redis存会话、保留Prisma存用户信息,需要自定义会话回调手动处理Redis的读写,这种方式复杂度较高,推荐直接使用Redis适配器。- 确保环境变量中配置了
REDIS_URL和SESSION_SECRET,与Express项目中的配置保持一致。
内容的提问来源于stack exchange,提问作者mcclosa
相关产品推荐
相关产品推荐

