@krashnakant/next-keycloak
Version:
An authentication library based on Keycloak for NextJs applications
1 lines • 9.1 kB
Source Map (JSON)
{"version":3,"file":"next-keycloak.umd.production.min.cjs","sources":["../src/utils/Util.ts","../src/utils/KeycloakInstance.ts","../src/providers/NextKeycloakAuthContext.tsx","../src/providers/NextKeycloakAuthProvider.tsx","../src/hooks/UseInitialKeycloak.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 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 { 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 { 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","base64","split","replace","converted","decodeURIComponent","atob","map","c","charCodeAt","toString","slice","join","JSON","parse","Keycloak","require","keycloakInstance","NextKeycloakAuthContext","createContext","loading","authenticated","login","_option","logout","register","hasRealmRole","accountManagement","children","config","initOption","initializedKeycloak","keycloak","setKeycloak","useState","useEffect","initialize","async","init","e","console","error","undefined","Boolean","userInfo","String","option","role","useInitKeycloak","useMemo","keycloakConfig","default","getKeycloakInstance","React","createElement","Provider","value","useContext"],"mappings":";;;;EAMO,MAAMA,WAAW,MAAwB,sBAAXC,QAOxBC,mBAAoBC;IAC/B,MAAMC,IAAcC,WAAWF;IAC/B,OAAO;MACLG,KAAKF,EAAYE;MACjBC,OAAOH,EAAYG;MACnBC,MAAMJ,EAAYK;MAClBC,QAAQN,EAAYO;;AACrB,KAMUN,aAAcF;IACzB,MACMS,IADYT,EAAMU,MAAM,KAAK,GACVC,QAAQ,KAAK,KAAKA,QAAQ,KAAK,MAClDC,IAAYC,mBAChBC,KAAKL,GACFC,MAAM,IACNK,KAAI,SAASC;MACZ,OAAO,OAAO,OAAOA,EAAEC,WAAW,GAAGC,SAAS,KAAKC,OAAO;AAC5D,QACCC,KAAK;IAEV,OAAOC,KAAKC,MAAMV;AAAU,KCjCxBW,IAAY1B,aAAsC,OAAzB2B,QAAQ;EAIvC,IAAIC,IAAoBF;EAOjB,MCVMG,IAA0BC,EAAAA,cAAwC;IAC7EC,UAAS;IACTC,gBAAe;IAGfC,OAAQC;IAERC,QAASD;IAETE,UAAWF;IAEXG,cAAeH,MAAoB;IAEnCI,mBAAmB;;+BCHjB,EAAGC,aAAUC,WAAQC;IACvB,MAGMC,ICFuB,EAC7Bd,GACAa,IAAkC;MAElC,OAAOE,GAAUC,KAAeC,EAAQA;MAExCC,EAAAA,WAAU;QACJlB,KACFmB;AACD,UACA;MAEH,MAAMA,aAAaC;QACjB;gBACQpB,EAAiBqB,KAAKR,IAC5BG,EAAYhB;AAGb,UAFC,OAAOsB;UACPC,QAAQC,MAAM;AACf;AAAA;MAsCH,OAAO;QACLrB,WAAmB,QAARY,KAAAA,EAAUX,sBAAoCqB,MAAnBV,EAASxC;QAC/CA,OAAOwC,IAAWA,EAASxC,QAAQ;QACnC6B,iBAAeW,KAAWW,QAAQX,EAASX;QAC3CuB,UAAkB,QAARZ,KAAAA,EAAUX,gBAChB9B,iBAAiBsD,OAAOb,EAASxC,eACjCkD;QACJpB,OA1CawB;UACb,IAAId,GACF,OAAOA,EAASV,MAAMwB;AAER;QAuChBtB,QApCcsB;UACd,SAAiBJ,MAAbV,GACF,OAAOA,EAASR,OAAOsB;AAET;QAiChBrB,UA9BgBqB;UAChB,IAAId,GACF,OAAOA,EAASP,SAASqB;AAEX;QA2BhBpB,cAjBoBqB,OAChBf,KACKA,EAASN,aAAaqB;QAgB/BpB,mBAzBwB;UACxB,IAAIK,GACF,OAAOA,EAASL;AAEF;;AAuBjB,MDnE2BqB,CAHXC,EAAAA,SAAQ,MFAzBC;MAIA,KAFqB7D,YAWrB,OALA4B,IAC8B,qBAArBF,EAASoC,UACZ,IAAIpC,EAASoC,QAAQD,KACrB,IAAInC,EAASmC;MAEZjC;AAAgB,MEZdmC,CAAoBvB,KAC1B,EAACA,MAC8DC;IAClE,OACEuB,EAAAC,cAACpC,EAAwBqC,UAAQ;MAACC,OAAOzB;OACtCH;AACgC,6BEhBJ,MAAM6B,EAAAA,WAAWvC;;;"}