diff --git a/.changeset/clever-cats-clean.md b/.changeset/clever-cats-clean.md new file mode 100644 index 0000000..973db42 --- /dev/null +++ b/.changeset/clever-cats-clean.md @@ -0,0 +1,5 @@ +--- +'@tern-secure/nextjs': patch +--- + +feat: update auth handling to remove FirebaseServerApp functionality diff --git a/apps/test/app/protected/page.tsx b/apps/test/app/protected/page.tsx index 13117d8..35e193c 100644 --- a/apps/test/app/protected/page.tsx +++ b/apps/test/app/protected/page.tsx @@ -4,10 +4,10 @@ import { ProtectedPageClient } from './protectedClient'; export const dynamic = 'force-dynamic'; export default async function ProtectedPage() { - const { user, require, redirectToSignIn } = await auth(); + const { sessionClaims, require, redirectToSignIn } = await auth(); if (!require({ role: 'admin' })) return
Access Denied now
; - if (!user) return redirectToSignIn(); + if (!sessionClaims?.aud) return redirectToSignIn(); - return ; + return ; } diff --git a/apps/test/app/protected/protectedClient.tsx b/apps/test/app/protected/protectedClient.tsx index f1513c6..544d822 100644 --- a/apps/test/app/protected/protectedClient.tsx +++ b/apps/test/app/protected/protectedClient.tsx @@ -1,12 +1,11 @@ "use client"; import { useRouter } from "next/navigation"; -import type { TernSecureUser } from "@tern-secure/nextjs"; +import type { DecodedIdToken } from "@tern-secure/nextjs"; -export type SerializableTernSecureUser = Omit; interface ProtectedPageClientProps { - user: SerializableTernSecureUser; + user: DecodedIdToken; } export function ProtectedPageClient({ diff --git a/packages/nextjs/src/app-router/server/auth.ts b/packages/nextjs/src/app-router/server/auth.ts index 2f8f157..fb6a3a3 100644 --- a/packages/nextjs/src/app-router/server/auth.ts +++ b/packages/nextjs/src/app-router/server/auth.ts @@ -3,7 +3,7 @@ import { createRedirect, createTernSecureRequest } from '@tern-secure/backend'; import { notFound, redirect } from 'next/navigation'; import { SIGN_IN_URL, SIGN_UP_URL } from '../../server/constant'; -import { type Aobj, getAuthDataFromRequest } from '../../server/data/getAuthDataFromRequest'; +import { getAuthDataFromRequest } from '../../server/data/getAuthDataFromRequest'; import { getAuthKeyFromRequest } from '../../server/headers-utils'; import { type AuthProtect, createProtect } from '../../server/protect'; import type { BaseUser, RequestLike } from '../../server/types'; @@ -20,7 +20,7 @@ export interface AuthResult { /** * `Auth` object of the currently active user and the `redirectToSignIn()` method. */ -type Auth = AuthObject & Aobj & { +type Auth = AuthObject & { redirectToSignIn: RedirectFun>; redirectToSignUp: RedirectFun>; }; diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts index 78235f8..3c56c78 100644 --- a/packages/nextjs/src/index.ts +++ b/packages/nextjs/src/index.ts @@ -15,6 +15,7 @@ export { } from './components/uiComponents' export type { + DecodedIdToken, TernSecureUser, SignInResponse, SignUpResponse, diff --git a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts index 5d79e8d..49f9f72 100644 --- a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts +++ b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts @@ -91,38 +91,35 @@ export async function getTernSecureAuthData( return authObjectToSerializable({ ...initialState, ...authObject }); } -export async function getAuthDataFromRequest(req: RequestLike): Promise { + +/** + * Given the issue ( https://github.com/firebase/firebase-js-sdk/issues/9423 ) that affects the authenticateRequest function, + * change from Promise to Promise only. no firebaseserverapp user object needed. + * @param req + * @returns + */ +export async function getAuthDataFromRequest(req: RequestLike): Promise { const authStatus = getAuthKeyFromRequest(req, "AuthStatus"); const authToken = getAuthKeyFromRequest(req, "AuthToken"); if (!authStatus || authStatus !== AuthStatus.SignedIn) { return { ...signedOutAuthObject(), - user: null, - userId: null } } - const firebaseUser = await authenticateRequest( - authToken as string, - req as any - ); - if (!firebaseUser || !firebaseUser.claims) { - return { - ...signedOutAuthObject(), - user: null, - userId: null - } - } - const { user } = firebaseUser; const jwt = ternDecodeJwt(authToken as string); const authObject = signedInAuthObject(authToken as string, jwt.payload); return { ...authObject, - user: user || null, }; } +/*** + * InitializeServerApp seems to have issue with Refer header. firebase doesnt have a fix yet. + * see link https://github.com/firebase/firebase-js-sdk/issues/9423 + * we might need to use this feature in the future when firebase fix this issue. + */ const authenticateRequest = async ( token: string, request: Request,