113 lines
2.6 KiB
TypeScript
113 lines
2.6 KiB
TypeScript
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)
|
|
}
|
|
}
|