UNPKG

@intrasoft/auth-next

Version:

A robust and customizable authentication package for Next.js app (router) applications, providing JWT-based authentication and token management

1 lines 9.28 kB
{"version":3,"sources":["../src/config.ts","../src/auth.ts","../src/tokens.ts","../src/client/index.ts","../src/client/useAuth.ts","../src/actions.ts","../src/server/index.ts","../src/server/SignIn.tsx","../src/server/SignOut.tsx"],"sourcesContent":["export type IntrasoftServerConfig = {\r\n signInUrl: string;\r\n accessCookie: string;\r\n refreshCookie: string;\r\n};\r\n\r\n/**\r\n * Validate the configuration.\r\n *\r\n * @param {IntrasoftServerConfig} config - The configuration object to validate.\r\n * @throws {Error} If any of the required configuration properties are missing.\r\n */\r\nfunction validateConfig(config: IntrasoftServerConfig) {\r\n if (config.accessCookie) {\r\n throw new Error(\"Missing or invalid accessLifetime in configuration\");\r\n }\r\n}\r\n\r\nlet CACHED_SERVER_CONFIG: IntrasoftServerConfig | undefined = undefined;\r\n\r\n/**\r\n * Gets the intrasoft required configurations\r\n * @returns {IntrasoftServerConfig}\r\n */\r\nexport function getConfig(): IntrasoftServerConfig {\r\n if (CACHED_SERVER_CONFIG) return CACHED_SERVER_CONFIG;\r\n const config: IntrasoftServerConfig = {\r\n signInUrl: process.env.INTRASOFT_SIGNIN_URL!,\r\n accessCookie: process.env.INTRASOFT_ACCESS_TOKEN_LIFETIME!,\r\n refreshCookie: process.env.INTRASOFT_REFRESH_TOKEN_LIFETIME!,\r\n };\r\n validateConfig(config);\r\n CACHED_SERVER_CONFIG = config;\r\n return config;\r\n}\r\n","import { getConfig } from \"./config\";\r\nimport { cookies } from \"next/headers\";\r\nimport { redirect } from \"next/navigation\";\r\nimport { decryptAuthToken, revalidatedTokens } from \"./tokens\";\r\nimport { IntrasoftJwtTokens } from \"@intrasoft/auth-core\";\r\n\r\n/**\r\n * Authenticates a user by checking their cookies and tokens.\r\n *\r\n * @returns {Promise<T>} The authenticated user object.\r\n * @throws {Error} If the user is not authenticated or if the tokens cannot be re-fetched.\r\n *\r\n * @example\r\n * ```typescript\r\n * const user = await auth<User>();\r\n * console.log(user);\r\n * ```\r\n */\r\nexport async function auth<T = any>(): Promise<T> {\r\n // Retrieve configuration\r\n const config = getConfig();\r\n // Retrieve cookies\r\n const _c = await cookies();\r\n\r\n // Extract tokens from cookies\r\n const tokens = {\r\n access: _c.get(config.accessCookie)?.value,\r\n refresh: _c.get(config.accessCookie)?.value,\r\n };\r\n\r\n // Check if user is authenticated\r\n if (!isAuthenticated(tokens)) {\r\n return redirect(config.signInUrl);\r\n }\r\n\r\n // Refetch tokens\r\n await refetchTokens(tokens as IntrasoftJwtTokens);\r\n\r\n // Decrypt access token to get user object\r\n const { payload: user } = await decryptAuthToken(tokens.access!);\r\n\r\n // If user object is not valid, redirect to sign-in URL\r\n if (!user) {\r\n return redirect(config.signInUrl);\r\n }\r\n\r\n // Return authenticated user object\r\n return user as T;\r\n}\r\n\r\n/**\r\n * Checks if the user is authenticated based on the provided tokens.\r\n *\r\n * @param {IntrasoftJwtTokens} tokens - The tokens to check.\r\n * @returns {boolean} True if the user is authenticated, false otherwise.\r\n */\r\nfunction isAuthenticated(tokens: Partial<IntrasoftJwtTokens>): boolean {\r\n return Boolean(tokens.access || tokens.refresh);\r\n}\r\n\r\n/**\r\n * Re-fetches the tokens.\r\n *\r\n * @param {IntrasoftJwtTokens} tokens - The tokens to refetch.\r\n * @returns {Promise<void>} A promise that resolves when the tokens are re-fetched.\r\n */\r\nasync function refetchTokens(\r\n tokens: IntrasoftJwtTokens\r\n): Promise<IntrasoftJwtTokens | undefined> {\r\n if (!tokens.refresh) {\r\n return;\r\n }\r\n return await revalidatedTokens(tokens.refresh);\r\n}\r\n","import { IntrasoftJwtTokens, IntrasoftJwtPayload } from \"@intrasoft/auth-core\";\r\nimport { refreshToken, decodeJwt } from \"@intrasoft/auth-core\";\r\n\r\n/**\r\n * Decrypts an authentication token.\r\n *\r\n * @param {string} access - The access token to be decrypted.\r\n * @returns {Promise<IntrasoftJwtPayload>} A promise that resolves to the decoded JWT.\r\n */\r\nexport async function decryptAuthToken(\r\n access: string\r\n): Promise<IntrasoftJwtPayload> {\r\n return await decodeJwt(access);\r\n}\r\n\r\n/**\r\n * Revalidates the tokens using the provided refresh token.\r\n *\r\n * This function takes a refresh token and uses it to obtain a new set of tokens\r\n *\r\n * @param {string} refresh - The refresh token used to obtain new tokens.\r\n * @returns {Promise<IntrasoftJwtTokens>} A promise that resolves to the new tokens.\r\n */\r\nexport async function revalidatedTokens(\r\n refresh: string\r\n): Promise<IntrasoftJwtTokens> {\r\n return await refreshToken(refresh);\r\n}\r\n","export { useAuth } from \"./useAuth\";\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { getCurrentUser } from \"../actions\";\r\n\r\nexport function useAuth() {\r\n const [user, setUser] = React.useState(null);\r\n\r\n const getUser = React.useCallback(async () => {\r\n try {\r\n const response = await getCurrentUser();\r\n setUser(response);\r\n } catch (error) {\r\n setUser(null);\r\n }\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n document.addEventListener(\"DOMContentLoaded\", getUser);\r\n document.addEventListener(\"visibilitychange\", getUser);\r\n\r\n return () => {\r\n document.removeEventListener(\"DOMContentLoaded\", getUser);\r\n document.removeEventListener(\"visibilitychange\", getUser);\r\n };\r\n }, []);\r\n\r\n return { user };\r\n}\r\n","\"use server\";\r\n\r\nimport { auth } from \"./auth\";\r\n\r\n/**\r\n * Retrieves the current authenticated user.\r\n *\r\n * @returns {Promise<any>} A promise that resolves to the current authenticated user.\r\n */\r\nexport async function getCurrentUser(): Promise<any> {\r\n return await auth();\r\n}\r\n\r\n/**\r\n * Logs out the current authenticated user.\r\n *\r\n * @param {any} payload - The payload sign and authenticate\r\n * @returns {Promise<void>}\r\n */\r\nexport async function loginUser(payload: any): Promise<void> {}\r\n\r\n/**\r\n * Logs out the current authenticated user.\r\n *\r\n * @returns {Promise<void>}\r\n */\r\nexport async function logoutUser(): Promise<void> {}\r\n","export { SignIn } from \"./SignIn\";\r\nexport { SignOut } from \"./SignOut\";\r\n","import React from \"react\";\r\nimport { auth } from \"../auth\";\r\nimport { redirect } from \"next/navigation\";\r\nimport { getConfig } from \"../config\";\r\n\r\ntype Props = {\r\n redirectUrl?: string;\r\n children: React.ReactNode;\r\n};\r\n\r\nexport async function SignIn(props: Props) {\r\n const user = await auth();\r\n const config = getConfig();\r\n\r\n if (!user) redirect(props.redirectUrl || config.signInUrl);\r\n\r\n return props.children;\r\n}\r\n","import React from \"react\";\r\nimport { auth } from \"../auth\";\r\nimport { redirect } from \"next/navigation\";\r\n\r\ntype Props = {\r\n redirectUrl?: string;\r\n children: React.ReactNode;\r\n};\r\n\r\nexport async function SignOut(props: Props) {\r\n const user = await auth();\r\n if (user) redirect(props.redirectUrl || \"/\");\r\n return props.children;\r\n}\r\n"],"mappings":";;;;;;;AAYA,SAAS,eAAe,QAA+B;AACrD,MAAI,OAAO,cAAc;AACvB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACF;AAEA,IAAI,uBAA0D;AAMvD,SAAS,YAAmC;AACjD,MAAI,qBAAsB,QAAO;AACjC,QAAM,SAAgC;AAAA,IACpC,WAAW,QAAQ,IAAI;AAAA,IACvB,cAAc,QAAQ,IAAI;AAAA,IAC1B,eAAe,QAAQ,IAAI;AAAA,EAC7B;AACA,iBAAe,MAAM;AACrB,yBAAuB;AACvB,SAAO;AACT;;;ACjCA,SAAS,eAAe;AACxB,SAAS,gBAAgB;;;ACDzB,SAAS,cAAc,iBAAiB;AAQxC,eAAsB,iBACpB,QAC8B;AAC9B,SAAO,MAAM,UAAU,MAAM;AAC/B;AAUA,eAAsB,kBACpB,SAC6B;AAC7B,SAAO,MAAM,aAAa,OAAO;AACnC;;;ADTA,eAAsB,OAA4B;AAlBlD;AAoBE,QAAM,SAAS,UAAU;AAEzB,QAAM,KAAK,MAAM,QAAQ;AAGzB,QAAM,SAAS;AAAA,IACb,SAAQ,QAAG,IAAI,OAAO,YAAY,MAA1B,mBAA6B;AAAA,IACrC,UAAS,QAAG,IAAI,OAAO,YAAY,MAA1B,mBAA6B;AAAA,EACxC;AAGA,MAAI,CAAC,gBAAgB,MAAM,GAAG;AAC5B,WAAO,SAAS,OAAO,SAAS;AAAA,EAClC;AAGA,QAAM,cAAc,MAA4B;AAGhD,QAAM,EAAE,SAAS,KAAK,IAAI,MAAM,iBAAiB,OAAO,MAAO;AAG/D,MAAI,CAAC,MAAM;AACT,WAAO,SAAS,OAAO,SAAS;AAAA,EAClC;AAGA,SAAO;AACT;AAQA,SAAS,gBAAgB,QAA8C;AACrE,SAAO,QAAQ,OAAO,UAAU,OAAO,OAAO;AAChD;AAQA,eAAe,cACb,QACyC;AACzC,MAAI,CAAC,OAAO,SAAS;AACnB;AAAA,EACF;AACA,SAAO,MAAM,kBAAkB,OAAO,OAAO;AAC/C;;;AEzEA;AAAA;AAAA;AAAA;;;ACEA,OAAO,WAAW;;;ACFlB;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,eAAsB,iBAA+B;AACnD,SAAO,MAAM,KAAK;AACpB;AAQA,eAAsB,UAAU,SAA6B;AAAC;AAO9D,eAAsB,aAA4B;AAAC;;;ADrB5C,SAAS,UAAU;AACxB,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,IAAI;AAE3C,QAAM,UAAU,MAAM,YAAY,YAAY;AAC5C,QAAI;AACF,YAAM,WAAW,MAAM,eAAe;AACtC,cAAQ,QAAQ;AAAA,IAClB,SAAS,OAAO;AACd,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,MAAM;AACpB,aAAS,iBAAiB,oBAAoB,OAAO;AACrD,aAAS,iBAAiB,oBAAoB,OAAO;AAErD,WAAO,MAAM;AACX,eAAS,oBAAoB,oBAAoB,OAAO;AACxD,eAAS,oBAAoB,oBAAoB,OAAO;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,KAAK;AAChB;;;AE5BA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAAS,YAAAA,iBAAgB;AAQzB,eAAsB,OAAO,OAAc;AACzC,QAAM,OAAO,MAAM,KAAK;AACxB,QAAM,SAAS,UAAU;AAEzB,MAAI,CAAC,KAAM,CAAAC,UAAS,MAAM,eAAe,OAAO,SAAS;AAEzD,SAAO,MAAM;AACf;;;ACfA,SAAS,YAAAC,iBAAgB;AAOzB,eAAsB,QAAQ,OAAc;AAC1C,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAM,CAAAA,UAAS,MAAM,eAAe,GAAG;AAC3C,SAAO,MAAM;AACf;","names":["redirect","redirect","redirect"]}