feat/valid-session: check valid user/session from token instead of making a slow request to api

This commit is contained in:
Linus Flood
2024-12-17 15:15:55 +01:00
parent 431ab477eb
commit 711bf4b2d3
5 changed files with 35 additions and 15 deletions

View File

@@ -1,11 +1,12 @@
import { redirect } from "next/navigation"
import { overview } from "@/constants/routes/myPages"
import { getProfileSafely } from "@/lib/trpc/memoizedRequests"
import { auth } from "@/auth"
import LoginButton from "@/components/LoginButton"
import { getIntl } from "@/i18n"
import { getLang } from "@/i18n/serverContext"
import { isValidSession } from "@/utils/session"
import styles from "./signUpVerification.module.css"
@@ -14,8 +15,8 @@ import type { SignUpVerificationProps } from "@/types/components/blocks/dynamicC
export default async function SignUpVerification({
dynamic_content,
}: SignUpVerificationProps) {
const user = await getProfileSafely()
if (user) {
const session = await auth()
if (isValidSession(session)) {
redirect(overview[getLang()])
}
const intl = await getIntl()

View File

@@ -1,18 +1,19 @@
import { redirect } from "next/navigation"
import { overview } from "@/constants/routes/myPages"
import { getProfileSafely } from "@/lib/trpc/memoizedRequests"
import { auth } from "@/auth"
import SignupForm from "@/components/Forms/Signup"
import { getLang } from "@/i18n/serverContext"
import { isValidSession } from "@/utils/session"
import type { SignupFormWrapperProps } from "@/types/components/blocks/dynamicContent"
export default async function SignupFormWrapper({
dynamic_content,
}: SignupFormWrapperProps) {
const user = await getProfileSafely()
if (user) {
const session = await auth()
if (isValidSession(session)) {
// We don't want to allow users to access signup if they are already authenticated.
redirect(overview[getLang()])
}

View File

@@ -1,5 +1,6 @@
import { getName } from "@/lib/trpc/memoizedRequests"
import { auth } from "@/auth"
import ArrowRight from "@/components/Icons/ArrowRight"
import { ScandicFriends } from "@/components/Levels"
import LoginButton from "@/components/LoginButton"
@@ -8,6 +9,7 @@ import Link from "@/components/TempDesignSystem/Link"
import Body from "@/components/TempDesignSystem/Text/Body"
import Title from "@/components/TempDesignSystem/Text/Title"
import { getIntl } from "@/i18n"
import { isValidSession } from "@/utils/session"
import Contact from "./Contact"
import ReadMore from "./ReadMore"
@@ -19,10 +21,10 @@ import type { JoinLoyaltyContactProps } from "@/types/components/sidebar/joinLoy
export default async function JoinLoyaltyContact({
block,
}: JoinLoyaltyContactProps) {
const [intl, user] = await Promise.all([getIntl(), getName()])
const [intl, session] = await Promise.all([getIntl(), auth()])
// Check if we have user, that means we are logged in.
if (user) {
// Check if we valid session, that means we are logged in.
if (isValidSession(session)) {
return null
}

View File

@@ -1,16 +1,14 @@
import { Suspense } from "react"
import { getName } from "@/lib/trpc/memoizedRequests"
import { auth } from "@/auth"
import MyPagesSidebar from "@/components/MyPages/Sidebar"
import { isValidSession } from "@/utils/session"
import SidebarNavigationSkeleton from "../MyPages/Sidebar/SidebarNavigationSkeleton"
export default async function MyPagesNavigation() {
const user = await getName()
// Check if we have user, that means we are logged in andt the My Pages menu can show.
if (!user) {
const session = await auth()
if (!isValidSession(session)) {
return null
}
return (

18
utils/session.ts Normal file
View File

@@ -0,0 +1,18 @@
import type { Session } from "next-auth"
export function isValidSession(session: Session | null) {
if (!session) {
console.log("No session available (user not authenticated).")
return false
}
if (session.error) {
console.log(`Session error: ${session.error}`)
return false
}
if (session.token.expires_at && session.token?.expires_at < Date.now()) {
console.log(`Session expired: ${session.token?.expires_at}`)
return false
}
return true
}