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

View File

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

View File

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

View File

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