diff --git a/src/server/index.js b/src/server/index.js index ef928c94..523cb17b 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -1,10 +1,4 @@ -// export {handleAuth} from '../handlers/appRouter/index'; -import * as serverSession from '../session/appRouter/index'; - -export const getKindeServerSession = () => { - return serverSession; -}; - +export {getKindeServerSession} from '../session/index'; export {authMiddleware} from '../authMiddleware/authMiddleware'; export {RegisterLink} from '../components/RegisterLink'; diff --git a/src/session/appRouter/getAccessToken.js b/src/session/appRouter/getAccessToken.js deleted file mode 100644 index 36e87aeb..00000000 --- a/src/session/appRouter/getAccessToken.js +++ /dev/null @@ -1,18 +0,0 @@ -import jwt_decode from 'jwt-decode'; -import {cookies} from 'next/headers'; - -export const getAccessToken = (request) => { - const cookieStore = cookies(); - const kinde_token = cookieStore.get('kinde_token'); - if (kinde_token) { - const accessTokenPayload = jwt_decode( - JSON.parse(kinde_token.value).access_token - ); - return accessTokenPayload; - } else { - return { - message: - 'There is no kinde_token, you are not authenticated. Try logging in.' - }; - } -}; diff --git a/src/session/appRouter/getBooleanFlag.js b/src/session/appRouter/getBooleanFlag.js deleted file mode 100644 index 2e339197..00000000 --- a/src/session/appRouter/getBooleanFlag.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getFlag} from './getFlag'; - -export const getBooleanFlag = (code, defaultValue) => { - try { - const flag = getFlag(code, defaultValue, 'b'); - return flag.value; - } catch (err) { - console.error(err); - } -}; diff --git a/src/session/appRouter/getClaim.js b/src/session/appRouter/getClaim.js deleted file mode 100644 index e3210e21..00000000 --- a/src/session/appRouter/getClaim.js +++ /dev/null @@ -1,12 +0,0 @@ -import {getAccessToken} from './getAccessToken'; -import {getIdToken} from './getIdToken'; - -export const getClaim = (claim) => { - const accessToken = getAccessToken(); - return accessToken ? accessToken[claim] : null; -}; - -export const getClaimFromIdToken = (claim) => { - const idToken = getIdToken(); - return idToken ? idToken[claim] : null; -}; diff --git a/src/session/appRouter/getFlag.js b/src/session/appRouter/getFlag.js deleted file mode 100644 index f18f25d4..00000000 --- a/src/session/appRouter/getFlag.js +++ /dev/null @@ -1,32 +0,0 @@ -import {getClaim} from './getClaim'; - -const flagDataTypeMap = { - s: 'string', - i: 'integer', - b: 'boolean' -}; - -export const getFlag = (code, defaultValue, flagType) => { - const flags = getClaim('feature_flags'); - const flag = flags && flags[code] ? flags[code] : {}; - - if (flag == {} && defaultValue == undefined) { - throw Error( - `Flag ${code} was not found, and no default value has been provided` - ); - } - - if (flagType && flag.t && flagType !== flag.t) { - throw Error( - `Flag ${code} is of type ${flagDataTypeMap[flag.t]} - requested type ${ - flagDataTypeMap[flagType] - }` - ); - } - return { - code, - type: flagDataTypeMap[flag.t || flagType], - value: flag.v == null ? defaultValue : flag.v, - is_default: flag.v == null - }; -}; diff --git a/src/session/appRouter/getIdToken.js b/src/session/appRouter/getIdToken.js deleted file mode 100644 index 88e8e96e..00000000 --- a/src/session/appRouter/getIdToken.js +++ /dev/null @@ -1,13 +0,0 @@ -import jwt_decode from 'jwt-decode'; -import {cookies} from 'next/headers'; - -export const getIdToken = (request) => { - const cookieStore = cookies(); - const kinde_token = cookieStore.get('kinde_token'); - if (kinde_token) { - const payload = jwt_decode(JSON.parse(kinde_token.value).id_token); - return payload; - } else { - return undefined; - } -}; diff --git a/src/session/appRouter/getIntegerFlag.js b/src/session/appRouter/getIntegerFlag.js deleted file mode 100644 index 150c5ed7..00000000 --- a/src/session/appRouter/getIntegerFlag.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getFlag} from './getFlag'; - -export const getIntegerFlag = (code, defaultValue) => { - try { - const flag = getFlag(code, defaultValue, 'i'); - return flag.value; - } catch (err) { - console.error(err); - } -}; diff --git a/src/session/appRouter/getOrganization.js b/src/session/appRouter/getOrganization.js deleted file mode 100644 index 0e7db791..00000000 --- a/src/session/appRouter/getOrganization.js +++ /dev/null @@ -1,8 +0,0 @@ -import { getClaim } from "./getClaim"; - -export const getOrganization = () => { - const orgCode = getClaim("org_code"); - return { - orgCode, - }; -}; diff --git a/src/session/appRouter/getPermission.js b/src/session/appRouter/getPermission.js deleted file mode 100644 index db4fce9e..00000000 --- a/src/session/appRouter/getPermission.js +++ /dev/null @@ -1,10 +0,0 @@ -import { getClaim } from "./getClaim"; - -export const getPermission = (key) => { - const orgCode = getClaim("org_code"); - const permissions = getClaim("permissions") || []; - return { - isGranted: permissions.some((p) => p === key), - orgCode, - }; -}; diff --git a/src/session/appRouter/getPermissions.js b/src/session/appRouter/getPermissions.js deleted file mode 100644 index 62e7d1ac..00000000 --- a/src/session/appRouter/getPermissions.js +++ /dev/null @@ -1,10 +0,0 @@ -import { getClaim } from "./getClaim"; - -export const getPermissions = () => { - const orgCode = getClaim("org_code"); - const permissions = getClaim("permissions"); - return { - permissions, - orgCode, - }; -}; diff --git a/src/session/appRouter/getStringFlag.js b/src/session/appRouter/getStringFlag.js deleted file mode 100644 index ac88c0a9..00000000 --- a/src/session/appRouter/getStringFlag.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getFlag} from './getFlag'; - -export const getStringFlag = (code, defaultValue) => { - try { - const flag = getFlag(code, defaultValue, 's'); - return flag.value; - } catch (err) { - console.error(err); - } -}; diff --git a/src/session/appRouter/getUser.js b/src/session/appRouter/getUser.js deleted file mode 100644 index ce6191d8..00000000 --- a/src/session/appRouter/getUser.js +++ /dev/null @@ -1,16 +0,0 @@ -import { getIdToken } from "./getIdToken"; - -const getUser = (req) => { - const idToken = getIdToken(req); - return idToken - ? { - id: idToken.sub, - given_name: idToken.given_name, - family_name: idToken.family_name, - email: idToken.email, - picture: idToken.picture, - } - : undefined; -}; - -export { getUser }; diff --git a/src/session/appRouter/getUserOrganizations.js b/src/session/appRouter/getUserOrganizations.js deleted file mode 100644 index eef25d35..00000000 --- a/src/session/appRouter/getUserOrganizations.js +++ /dev/null @@ -1,8 +0,0 @@ -import {getClaimFromIdToken} from './getClaim'; - -export const getUserOrganizations = (req) => { - const orgCodes = getClaimFromIdToken('org_codes'); - return { - orgCodes - }; -}; diff --git a/src/session/appRouter/index.js b/src/session/appRouter/index.js deleted file mode 100644 index cdf03cc3..00000000 --- a/src/session/appRouter/index.js +++ /dev/null @@ -1,12 +0,0 @@ -export {getAccessToken} from './getAccessToken'; -export {getBooleanFlag} from './getBooleanFlag'; -export {getFlag} from './getFlag'; -export {getIdToken} from './getIdToken'; -export {getIntegerFlag} from './getIntegerFlag'; -export {getOrganization} from './getOrganization'; -export {getPermission} from './getPermission'; -export {getPermissions} from './getPermissions'; -export {getStringFlag} from './getStringFlag'; -export {getUserOrganizations} from './getUserOrganizations'; -export {getUser} from './getUser'; -export {isAuthenticated} from './isAuthenticated'; diff --git a/src/session/appRouter/isAuthenticated.js b/src/session/appRouter/isAuthenticated.js deleted file mode 100644 index cd5d7dcf..00000000 --- a/src/session/appRouter/isAuthenticated.js +++ /dev/null @@ -1,5 +0,0 @@ -import { getUser } from "./getUser"; - -const isAuthenticated = (req) => Boolean(getUser(req)); - -export { isAuthenticated }; diff --git a/src/session/getAccessToken.js b/src/session/getAccessToken.js new file mode 100644 index 00000000..9e11a59b --- /dev/null +++ b/src/session/getAccessToken.js @@ -0,0 +1,5 @@ +import {sessionManager} from './sessionManager'; + +export const getAccessTokenFactory = (req, res) => async () => { + return await sessionManager(req, res).getSessionItem('access_token_payload'); +}; diff --git a/src/session/getBooleanFlag.js b/src/session/getBooleanFlag.js new file mode 100644 index 00000000..129eae80 --- /dev/null +++ b/src/session/getBooleanFlag.js @@ -0,0 +1,12 @@ +import {getFlagFactory} from './getFlag'; + +export const getBooleanFlagFactory = + (req, res) => async (code, defaultValue) => { + try { + const flag = await getFlagFactory(req, res)(code, defaultValue, 'b'); + return flag.value; + } catch (err) { + console.error(err); + return null; + } + }; diff --git a/src/session/getFlag.js b/src/session/getFlag.js new file mode 100644 index 00000000..1b7fc943 --- /dev/null +++ b/src/session/getFlag.js @@ -0,0 +1,21 @@ +import {sessionManager} from './sessionManager'; +import {kindeClient} from './kindeServerClient'; + +export const getFlagFactory = + (req, res) => async (code, defaultValue, flagType) => { + try { + const flag = await kindeClient.getFlag( + sessionManager(req, res), + code, + defaultValue, + flagType + ); + + return flag; + } catch (error) { + if (error.message.includes('no default value has been provided')) { + throw error; + } + return {value: defaultValue}; + } + }; diff --git a/src/session/getIntegerFlag.js b/src/session/getIntegerFlag.js new file mode 100644 index 00000000..15a38eb7 --- /dev/null +++ b/src/session/getIntegerFlag.js @@ -0,0 +1,12 @@ +import {getFlagFactory} from './getFlag'; + +export const getIntegerFlagFactory = + (req, res) => async (code, defaultValue) => { + try { + const flag = await getFlagFactory(req, res)(code, defaultValue, 'i'); + return flag.value; + } catch (err) { + console.error(err); + return null; + } + }; diff --git a/src/session/getOrganization.js b/src/session/getOrganization.js new file mode 100644 index 00000000..8c287656 --- /dev/null +++ b/src/session/getOrganization.js @@ -0,0 +1,13 @@ +import {sessionManager} from './sessionManager'; +import {kindeClient} from './kindeServerClient'; + +export const getOrganizationFactory = (req, res) => async () => { + try { + const organization = await kindeClient.getOrganization( + sessionManager(req, res) + ); + return organization; + } catch (error) { + return null; + } +}; diff --git a/src/session/getPermission.js b/src/session/getPermission.js new file mode 100644 index 00000000..efc77860 --- /dev/null +++ b/src/session/getPermission.js @@ -0,0 +1,14 @@ +import {sessionManager} from './sessionManager'; +import {kindeClient} from './kindeServerClient'; + +export const getPermissionFactory = (req, res) => async (name) => { + try { + const permission = await kindeClient.getPermission( + sessionManager(req, res), + name + ); + return permission; + } catch (error) { + return null; + } +}; diff --git a/src/session/getPermissions.js b/src/session/getPermissions.js new file mode 100644 index 00000000..aa8ee8cc --- /dev/null +++ b/src/session/getPermissions.js @@ -0,0 +1,13 @@ +import {sessionManager} from './sessionManager'; +import {kindeClient} from './kindeServerClient'; + +export const getPermissionsFactory = (req, res) => async () => { + try { + const permissions = await kindeClient.getPermissions( + sessionManager(req, res) + ); + return permissions; + } catch (error) { + return null; + } +}; diff --git a/src/session/getStringFlag.js b/src/session/getStringFlag.js new file mode 100644 index 00000000..f31ce329 --- /dev/null +++ b/src/session/getStringFlag.js @@ -0,0 +1,12 @@ +import {getFlagFactory} from './getFlag'; + +export const getStringFlagFactory = + (req, res) => async (code, defaultValue) => { + try { + const flag = await getFlagFactory(req, res)(code, defaultValue, 's'); + return flag.value; + } catch (err) { + console.error(err); + return null; + } + }; diff --git a/src/session/getUser.js b/src/session/getUser.js new file mode 100644 index 00000000..5814c420 --- /dev/null +++ b/src/session/getUser.js @@ -0,0 +1,11 @@ +import {sessionManager} from './sessionManager'; +import {kindeClient} from './kindeServerClient'; + +export const getUserFactory = (req, res) => async () => { + try { + const user = await kindeClient.getUser(sessionManager(req, res)); + return user; + } catch (error) { + return null; + } +}; diff --git a/src/session/getUserOrganizations.js b/src/session/getUserOrganizations.js new file mode 100644 index 00000000..e16f89fd --- /dev/null +++ b/src/session/getUserOrganizations.js @@ -0,0 +1,13 @@ +import {sessionManager} from './sessionManager'; +import {kindeClient} from './kindeServerClient'; + +export const getUserOrganizationsFactory = (req, res) => async () => { + try { + const userOrgs = await kindeClient.getUserOrganizations( + sessionManager(req, res) + ); + return userOrgs; + } catch (error) { + return null; + } +}; diff --git a/src/session/index.js b/src/session/index.js new file mode 100644 index 00000000..5b972bf2 --- /dev/null +++ b/src/session/index.js @@ -0,0 +1,25 @@ +import {getAccessTokenFactory} from './getAccessToken'; +import {getBooleanFlagFactory} from './getBooleanFlag'; +import {getFlagFactory} from './getFlag'; +import {getIntegerFlagFactory} from './getIntegerFlag'; +import {getOrganizationFactory} from './getOrganization'; +import {getPermissionFactory} from './getPermission'; +import {getPermissionsFactory} from './getPermissions'; +import {getStringFlagFactory} from './getStringFlag'; +import {getUserFactory} from './getUser'; +import {getUserOrganizationsFactory} from './getUserOrganizations'; +import {isAuthenticatedFactory} from './isAuthenticated'; + +export const getKindeServerSession = (req, res) => ({ + getAccessToken: getAccessTokenFactory(req, res), + getBooleanFlag: getBooleanFlagFactory(req, res), + getFlag: getFlagFactory(req, res), + getIntegerFlag: getIntegerFlagFactory(req, res), + getOrganization: getOrganizationFactory(req, res), + getPermission: getPermissionFactory(req, res), + getPermissions: getPermissionsFactory(req, res), + getStringFlag: getStringFlagFactory(req, res), + getUser: getUserFactory(req, res), + getUserOrganizations: getUserOrganizationsFactory(req, res), + isAuthenticated: isAuthenticatedFactory(req, res) +}); diff --git a/src/session/isAuthenticated.js b/src/session/isAuthenticated.js new file mode 100644 index 00000000..1bc71047 --- /dev/null +++ b/src/session/isAuthenticated.js @@ -0,0 +1,6 @@ +import {getUserFactory} from './getUser'; + +export const isAuthenticatedFactory = (req, res) => async () => { + const user = await getUserFactory(req, res)(); + return Boolean(user); +}; diff --git a/src/session/kindeServerClient.js b/src/session/kindeServerClient.js new file mode 100644 index 00000000..39c42413 --- /dev/null +++ b/src/session/kindeServerClient.js @@ -0,0 +1,7 @@ +import {createKindeServerClient} from '@kinde-oss/kinde-typescript-sdk'; +import {config} from '../config/index'; + +export const kindeClient = createKindeServerClient( + config.grantType, + config.clientOptions +); diff --git a/src/session/pagesRouter/getAccessToken.js b/src/session/pagesRouter/getAccessToken.js deleted file mode 100644 index e531d944..00000000 --- a/src/session/pagesRouter/getAccessToken.js +++ /dev/null @@ -1,15 +0,0 @@ -import jwt_decode from 'jwt-decode'; - -export const getAccessToken = (req, res) => { - if (req.cookies.kinde_token) { - const accessTokenPayload = jwt_decode( - JSON.parse(req.cookies.kinde_token).access_token - ); - return accessTokenPayload; - } else { - return { - message: - 'There is no kinde_token, you are not authenticated. Try logging in.' - }; - } -}; diff --git a/src/session/pagesRouter/getBooleanFlag.js b/src/session/pagesRouter/getBooleanFlag.js deleted file mode 100644 index 2e339197..00000000 --- a/src/session/pagesRouter/getBooleanFlag.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getFlag} from './getFlag'; - -export const getBooleanFlag = (code, defaultValue) => { - try { - const flag = getFlag(code, defaultValue, 'b'); - return flag.value; - } catch (err) { - console.error(err); - } -}; diff --git a/src/session/pagesRouter/getClaim.js b/src/session/pagesRouter/getClaim.js deleted file mode 100644 index a3a1d7f6..00000000 --- a/src/session/pagesRouter/getClaim.js +++ /dev/null @@ -1,12 +0,0 @@ -import {getAccessToken} from './getAccessToken'; -import {getIdToken} from './getIdToken'; - -export const getClaim = (req, res, claim) => { - const accessToken = getAccessToken(req, res); - return accessToken ? accessToken[claim] : null; -}; - -export const getClaimFromIdToken = (req, res, claim) => { - const idToken = getIdToken(req, res); - return idToken ? idToken[claim] : null; -}; diff --git a/src/session/pagesRouter/getFlag.js b/src/session/pagesRouter/getFlag.js deleted file mode 100644 index f18f25d4..00000000 --- a/src/session/pagesRouter/getFlag.js +++ /dev/null @@ -1,32 +0,0 @@ -import {getClaim} from './getClaim'; - -const flagDataTypeMap = { - s: 'string', - i: 'integer', - b: 'boolean' -}; - -export const getFlag = (code, defaultValue, flagType) => { - const flags = getClaim('feature_flags'); - const flag = flags && flags[code] ? flags[code] : {}; - - if (flag == {} && defaultValue == undefined) { - throw Error( - `Flag ${code} was not found, and no default value has been provided` - ); - } - - if (flagType && flag.t && flagType !== flag.t) { - throw Error( - `Flag ${code} is of type ${flagDataTypeMap[flag.t]} - requested type ${ - flagDataTypeMap[flagType] - }` - ); - } - return { - code, - type: flagDataTypeMap[flag.t || flagType], - value: flag.v == null ? defaultValue : flag.v, - is_default: flag.v == null - }; -}; diff --git a/src/session/pagesRouter/getIdToken.js b/src/session/pagesRouter/getIdToken.js deleted file mode 100644 index 23e7d430..00000000 --- a/src/session/pagesRouter/getIdToken.js +++ /dev/null @@ -1,15 +0,0 @@ -import jwt_decode from 'jwt-decode'; - -export const getIdToken = (req, res) => { - if (req.cookies.kinde_token) { - const accessTokenPayload = jwt_decode( - JSON.parse(req.cookies.kinde_token).id_token - ); - return accessTokenPayload; - } else { - return { - message: - 'There is no kinde_token, you are not authenticated. Try logging in.' - }; - } -}; diff --git a/src/session/pagesRouter/getIntegerFlag.js b/src/session/pagesRouter/getIntegerFlag.js deleted file mode 100644 index 150c5ed7..00000000 --- a/src/session/pagesRouter/getIntegerFlag.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getFlag} from './getFlag'; - -export const getIntegerFlag = (code, defaultValue) => { - try { - const flag = getFlag(code, defaultValue, 'i'); - return flag.value; - } catch (err) { - console.error(err); - } -}; diff --git a/src/session/pagesRouter/getOrganization.js b/src/session/pagesRouter/getOrganization.js deleted file mode 100644 index 4fb00455..00000000 --- a/src/session/pagesRouter/getOrganization.js +++ /dev/null @@ -1,8 +0,0 @@ -import {getClaim} from './getClaim'; - -export const getOrganization = (req, res) => { - const orgCode = getClaim(req, res, 'org_code'); - return { - orgCode - }; -}; diff --git a/src/session/pagesRouter/getPermission.js b/src/session/pagesRouter/getPermission.js deleted file mode 100644 index 125cb0c6..00000000 --- a/src/session/pagesRouter/getPermission.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getClaim} from './getClaim'; - -export const getPermission = (req, res, key) => { - const orgCode = getClaim(req, res, 'org_code'); - const permissions = getClaim(req, res, 'permissions') || []; - return { - isGranted: permissions.some((p) => p === key), - orgCode - }; -}; diff --git a/src/session/pagesRouter/getPermissions.js b/src/session/pagesRouter/getPermissions.js deleted file mode 100644 index b040eff2..00000000 --- a/src/session/pagesRouter/getPermissions.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getClaim} from './getClaim'; - -export const getPermissions = (req, res) => { - const orgCode = getClaim(req, res, 'org_code'); - const permissions = getClaim(req, res, 'permissions'); - return { - permissions, - orgCode - }; -}; diff --git a/src/session/pagesRouter/getStringFlag.js b/src/session/pagesRouter/getStringFlag.js deleted file mode 100644 index ac88c0a9..00000000 --- a/src/session/pagesRouter/getStringFlag.js +++ /dev/null @@ -1,10 +0,0 @@ -import {getFlag} from './getFlag'; - -export const getStringFlag = (code, defaultValue) => { - try { - const flag = getFlag(code, defaultValue, 's'); - return flag.value; - } catch (err) { - console.error(err); - } -}; diff --git a/src/session/pagesRouter/getUserOrganizations.js b/src/session/pagesRouter/getUserOrganizations.js deleted file mode 100644 index 67a5c746..00000000 --- a/src/session/pagesRouter/getUserOrganizations.js +++ /dev/null @@ -1,8 +0,0 @@ -import {getClaimFromIdToken} from './getClaim'; - -export const getUserOrganizations = (req, res) => { - const orgCodes = getClaimFromIdToken(req, res, 'org_codes'); - return { - orgCodes - }; -}; diff --git a/src/session/pagesRouter/index.js b/src/session/pagesRouter/index.js deleted file mode 100644 index ced7320b..00000000 --- a/src/session/pagesRouter/index.js +++ /dev/null @@ -1,10 +0,0 @@ -export {getAccessToken} from './getAccessToken'; -export {getBooleanFlag} from './getBooleanFlag'; -export {getFlag} from './getFlag'; -export {getIdToken} from './getIdToken'; -export {getIntegerFlag} from './getIntegerFlag'; -export {getOrganization} from './getOrganization'; -export {getPermission} from './getPermission'; -export {getPermissions} from './getPermissions'; -export {getStringFlag} from './getStringFlag'; -export {getUserOrganizations} from './getUserOrganizations';