@krashnakant/next-keycloak
Version:
An authentication library based on Keycloak for NextJs applications
128 lines (118 loc) • 4.07 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.KrashnakantNextKeycloak = {}, global.React));
})(this, (function (exports, React) { 'use strict';
const isServer = () => typeof window === 'undefined';
const getUserFromToken = token => {
const parsedToken = parseToken(token);
return {
sub: parsedToken.sub,
email: parsedToken.email,
name: parsedToken.given_name,
family: parsedToken.family_name
};
};
const parseToken = token => {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace('-', '+').replace('_', '/');
const converted = decodeURIComponent(atob(base64).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(converted);
};
const useInitKeycloak = (keycloakInstance, initOption = {}) => {
const [keycloak, setKeycloak] = React.useState();
React.useEffect(() => {
if (keycloakInstance) {
initialize();
}
}, []);
const initialize = async () => {
try {
await keycloakInstance.init(initOption);
setKeycloak(keycloakInstance);
} catch (e) {
console.error('failed to initialize keycloak');
}
};
const login = option => {
if (keycloak) {
return keycloak.login(option);
}
return undefined;
};
const logout = option => {
if (keycloak !== undefined) {
return keycloak.logout(option);
}
return undefined;
};
const register = option => {
if (keycloak) {
return keycloak.register(option);
}
return undefined;
};
const accountManagement = () => {
if (keycloak) {
return keycloak.accountManagement();
}
return undefined;
};
const hasRealmRole = role => {
if (keycloak) {
return keycloak.hasRealmRole(role);
}
return false;
};
return {
loading: !(keycloak != null && keycloak.authenticated && keycloak.token !== undefined),
token: keycloak ? keycloak.token : '',
authenticated: keycloak ? Boolean(keycloak.authenticated) : false,
userInfo: keycloak != null && keycloak.authenticated ? getUserFromToken(String(keycloak.token)) : undefined,
login,
logout,
register,
hasRealmRole,
accountManagement
};
};
const Keycloak = ! /*#__PURE__*/isServer() ? /*#__PURE__*/require("keycloak-js") : null;
let keycloakInstance = Keycloak;
const getKeycloakInstance = keycloakConfig => {
const isServerSide = isServer();
if (isServerSide) {
return undefined;
}
keycloakInstance = typeof Keycloak.default === 'function' ? new Keycloak.default(keycloakConfig) : new Keycloak(keycloakConfig);
return keycloakInstance;
};
const NextKeycloakAuthContext = /*#__PURE__*/React.createContext({
loading: true,
authenticated: false,
login: _option => {},
logout: _option => {},
register: _option => {},
hasRealmRole: _option => false,
accountManagement: () => {}
});
const NextKeycloakAuthProvider = ({
children,
config,
initOption
}) => {
const keycloak = React.useMemo(() => {
return getKeycloakInstance(config);
}, [config]);
const initializedKeycloak = useInitKeycloak(keycloak, initOption);
return /*#__PURE__*/React.createElement(NextKeycloakAuthContext.Provider, {
value: initializedKeycloak
}, children);
};
const useNextKeycloakAuth = () => React.useContext(NextKeycloakAuthContext);
exports.NextKeycloakAuthProvider = NextKeycloakAuthProvider;
exports.useNextKeycloakAuth = useNextKeycloakAuth;
Object.defineProperty(exports, '__esModule', { value: true });
}));
//# sourceMappingURL=next-keycloak.umd.development.cjs.map