You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:06:33