@krashnakant/next-keycloak
Version:
An authentication library based on Keycloak for NextJs applications
1 lines • 11.4 kB
Source Map (JSON)
{"version":3,"file":"next-keycloak.umd.development.cjs","sources":["../src/utils/Util.ts","../src/hooks/UseInitialKeycloak.tsx","../src/utils/KeycloakInstance.ts","../src/providers/NextKeycloakAuthContext.tsx","../src/providers/NextKeycloakAuthProvider.tsx","../src/hooks/UseNextKeycloakAuth.tsx"],"sourcesContent":["import { INextKeycloakUser } from '../interfaces';\n\n/**\n * @description To determine server-side or client-side\n * @returns boolean\n */\nexport const isServer = () => typeof window === 'undefined';\n\n/**\n * @description Get token and return minimal user information\n * @param token\n * @returns\n */\nexport const getUserFromToken = (token: string): INextKeycloakUser => {\n const parsedToken = parseToken(token) as any;\n return {\n sub: parsedToken.sub,\n email: parsedToken.email,\n name: parsedToken.given_name,\n family: parsedToken.family_name,\n };\n};\n\n/**\n * @description a function to parse token\n */\nexport const parseToken = (token: string) => {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace('-', '+').replace('_', '/');\n const converted = decodeURIComponent(\n atob(base64)\n .split('')\n .map(function(c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join('')\n );\n return JSON.parse(converted);\n};\n","import { useEffect, useState } from 'react';\nimport Keycloak, {\n KeycloakInitOptions,\n KeycloakLoginOptions,\n KeycloakLogoutOptions,\n KeycloakRegisterOptions,\n} from 'keycloak-js';\nimport { INextKeycloakAuthContext } from '../interfaces';\nimport { getUserFromToken } from '../utils/Util';\n\n/**\n *\n * @description A hook to initialize and provide Keycloak functionalities\n * @param keycloakInstance\n * @param initOption\n * @returns\n */\nexport const useInitKeycloak = (\n keycloakInstance: Keycloak,\n initOption: KeycloakInitOptions = {},\n): INextKeycloakAuthContext => {\n const [keycloak, setKeycloak] = useState<Keycloak>();\n\n useEffect(() => {\n if (keycloakInstance) {\n initialize();\n }\n }, []);\n\n const initialize = async () => {\n try {\n await keycloakInstance.init(initOption);\n setKeycloak(keycloakInstance);\n } catch (e) {\n console.error('failed to initialize keycloak');\n }\n };\n\n const login = (option: KeycloakLoginOptions) => {\n if (keycloak) {\n return keycloak.login(option);\n }\n return undefined;\n };\n\n const logout = (option: KeycloakLogoutOptions) => {\n if (keycloak !== undefined) {\n return keycloak.logout(option);\n }\n return undefined;\n };\n\n const register = (option: KeycloakRegisterOptions) => {\n if (keycloak) {\n return keycloak.register(option);\n }\n return undefined;\n };\n\n const accountManagement = () => {\n if (keycloak) {\n return keycloak.accountManagement();\n }\n return undefined;\n };\n\n const hasRealmRole = (role: string): boolean => {\n if (keycloak) {\n return keycloak.hasRealmRole(role);\n }\n return false;\n };\n\n return {\n loading: !(keycloak?.authenticated && keycloak.token !== undefined),\n token: keycloak ? keycloak.token : '',\n authenticated: keycloak ? Boolean(keycloak.authenticated) : false,\n userInfo: keycloak?.authenticated\n ? getUserFromToken(String(keycloak.token))\n : undefined,\n login,\n logout,\n register,\n hasRealmRole,\n accountManagement,\n // keycloakInstance: keycloak,\n };\n};\n","import type { KeycloakConfig } from \"keycloak-js\";\nimport { isServer } from \"./Util\";\n\n\nconst Keycloak = !isServer() ? require(\"keycloak-js\") : null;\n\nexport type Keycloak = typeof Keycloak;\n// Global Keycloak instance\nlet keycloakInstance = Keycloak;\n\n/**\n * @description A function to create instance of Keycloak based on proper environment (server or client)\n * @param keycloakConfig \n * @returns \n */\nexport const getKeycloakInstance = (\n keycloakConfig: KeycloakConfig\n): Keycloak | undefined => {\n const isServerSide = isServer();\n\n if (isServerSide) {\n return undefined;\n }\n\n keycloakInstance =\n typeof Keycloak.default === 'function'\n ? new Keycloak.default(keycloakConfig)\n : new Keycloak(keycloakConfig);\n\n return keycloakInstance;\n};\n\n","// import { KeycloakInstance } from 'keycloak-js';\nimport { createContext } from 'react';\nimport { INextKeycloakAuthContext } from '../interfaces';\nimport { KeycloakLoginOptions, KeycloakRegisterOptions } from 'keycloak-js';\n\nexport const NextKeycloakAuthContext = createContext<INextKeycloakAuthContext>({\n loading: true,\n authenticated: false,\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-unused-vars\n login: (_option?: KeycloakLoginOptions) => {},\n // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-unused-vars\n logout: (_option: KeycloakLoginOptions) => {},\n // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-unused-vars\n register: (_option: KeycloakRegisterOptions) => {},\n // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-unused-vars\n hasRealmRole: (_option: string) => false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-unused-vars\n accountManagement: () => {},\n // keycloakInstance: {} as KeycloakInstance,\n});\n","import Keycloak, { KeycloakConfig, KeycloakInitOptions } from 'keycloak-js';\nimport React, { FC, useMemo } from 'react';\nimport { useInitKeycloak } from '../hooks/UseInitialKeycloak';\n\nimport { getKeycloakInstance } from '../utils/KeycloakInstance';\nimport { NextKeycloakAuthContext } from './NextKeycloakAuthContext';\n\ninterface IKeycloakAuthenticationProviderProps {\n config: KeycloakConfig;\n initOption?: KeycloakInitOptions;\n children: React.ReactNode;\n}\n\nexport const NextKeycloakAuthProvider: FC<\n IKeycloakAuthenticationProviderProps\n> = ({ children, config, initOption }) => {\n const keycloak = useMemo(() => {\n return getKeycloakInstance(config);\n }, [config]);\n const initializedKeycloak = useInitKeycloak(keycloak as Keycloak, initOption);\n return (\n <NextKeycloakAuthContext.Provider value={initializedKeycloak}>\n {children}\n </NextKeycloakAuthContext.Provider>\n );\n};\n","import { useContext } from 'react';\nimport { NextKeycloakAuthContext } from '../providers/NextKeycloakAuthContext';\n\n/**\n *\n * @description A hook to use NextKeycloakAuthContext on client side\n */\nexport const useNextKeycloakAuth = () => useContext(NextKeycloakAuthContext);\n"],"names":["isServer","window","getUserFromToken","token","parsedToken","parseToken","sub","email","name","given_name","family","family_name","base64Url","split","base64","replace","converted","decodeURIComponent","atob","map","c","charCodeAt","toString","slice","join","JSON","parse","useInitKeycloak","keycloakInstance","initOption","keycloak","setKeycloak","useState","useEffect","initialize","init","e","console","error","login","option","undefined","logout","register","accountManagement","hasRealmRole","role","loading","authenticated","Boolean","userInfo","String","Keycloak","require","getKeycloakInstance","keycloakConfig","isServerSide","default","NextKeycloakAuthContext","createContext","_option","NextKeycloakAuthProvider","children","config","useMemo","initializedKeycloak","React","createElement","Provider","value","useNextKeycloakAuth","useContext"],"mappings":"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"}