import { Login } from "@/components/login/api/types" import redis from "@/components/login/libs/redis" import { deleteCachedSession, setCachedSession, } from "@/components/login/libs/session-cache" import { createSessionRedisKey, getSessionRedisKeyFromCookieValue, SESSION_COOKIE_NAME, } from "@/components/login/libs/session-common" import { cookies } from "next/headers" export const handleLoginData = async (props: { clientIP: string fingerprint: string data: Login.ResLabelLogin }) => { const { clientIP, fingerprint, data } = props const cookieStore = await cookies() const oldSessionKey = getSessionRedisKeyFromCookieValue( cookieStore.get(SESSION_COOKIE_NAME)?.value ) if (oldSessionKey) { await redis.del(oldSessionKey) deleteCachedSession(oldSessionKey) } const sessionRedisKey = createSessionRedisKey() const sessionUserData = { clientIP, fingerprint: fingerprint, user_name: data?.name, access_token: data.token, refresh_token: data.refresh_token, } // save redis await redis.set( sessionRedisKey, JSON.stringify(sessionUserData), "EX", 172800 ) setCachedSession(sessionRedisKey, sessionUserData) // set cookie cookieStore.set(SESSION_COOKIE_NAME, sessionRedisKey, { httpOnly: true, secure: process.env.NEXT_PUBLIC_COOKIE_ENV === "production", maxAge: 60 * 60 * 24 * 30, // 30天 path: "/", }) return { ...data, token: "", access_token: "", refresh_token: "", } } export const handleRefreshToken = async (props: { data: Login.ResLabelLogin userData: any }) => { const { userData, data } = props const { redisKey, ...rest } = userData const sessionRedisKey = getSessionRedisKeyFromCookieValue(redisKey) if (!sessionRedisKey) { throw new Error("未获取到有效的 session key") } const sessionUserData = { ...rest, user_name: data?.name, access_token: data.token, refresh_token: data.refresh_token, } await redis.set( sessionRedisKey, JSON.stringify(sessionUserData), "EX", 172800 ) setCachedSession(sessionRedisKey, sessionUserData) return { ...data, token: "", access_token: "", refresh_token: "", } } export const handleDeleteCookie = async () => { const cookieStore = await cookies() const sessionData = cookieStore.get(SESSION_COOKIE_NAME)?.value || "" const sessionRedisKey = getSessionRedisKeyFromCookieValue(sessionData) // 删cookie和redis中用户 if (sessionRedisKey) { await redis.del(sessionRedisKey) deleteCachedSession(sessionRedisKey) } if (sessionData) { cookieStore.delete(SESSION_COOKIE_NAME) } }