From 57606be301670ca45a6d4f3d6256ecfe62813df4 Mon Sep 17 00:00:00 2001 From: Ryan Iguchi Date: Fri, 30 Aug 2024 17:53:57 +0200 Subject: [PATCH 1/2] adding kv map in Auth plugin --- packages/auth/plugin.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/auth/plugin.ts b/packages/auth/plugin.ts index 1b4ff9e9..edf7a0e6 100644 --- a/packages/auth/plugin.ts +++ b/packages/auth/plugin.ts @@ -1,6 +1,6 @@ import { useExtendContext, type PromiseOrValue } from '@envelop/core' import { useGenericAuth } from '@envelop/generic-auth' -import { Plugin, type TokenContents } from '@zemble/core' +import { Plugin } from '@zemble/core' import graphqlYoga from '@zemble/graphql' import kv from '@zemble/kv' import { @@ -15,6 +15,7 @@ import { handleValueNode, transformObjectNode } from './utils/graphqlToJSMappers import { setTokenCookies } from './utils/setBearerTokenCookie' import type { decodeToken as defaultDecodeToken } from './utils/decodeToken' +import type { IStandardKeyValueService, TokenContents } from '@zemble/core' import type { ExecutionArgs, FieldNode, GraphQLObjectType, ObjectValueNode, } from 'graphql' @@ -52,6 +53,17 @@ interface AuthConfig extends Zemble.GlobalConfig { } } +const initializedKvs = new Map>() +const getKv = (key: string): IStandardKeyValueService => { + if (initializedKvs.has(key)) { + return initializedKvs.get(key) as IStandardKeyValueService + } + + const newKv = plugin.providers.kv(key) + initializedKvs.set(key, newKv) + return newKv +} + function isGraphQlWsContext(context: Context | Zemble.GraphQlWsContext): context is Zemble.GraphQlWsContext { return 'connectionParams' in context } @@ -106,12 +118,12 @@ const validateMatch = (matchValueNode: ObjectValueNode, decodedToken: Record => { // we need to force sub to be set for all tokens for this to work - const isInvalid = await plugin.providers.kv('invalid-tokens').get(`${(decodedToken as JWTPayload).sub}:${token}`) + const isInvalid = await getKv('invalid-tokens').get(`${(decodedToken as JWTPayload).sub}:${token}`) if (isInvalid) { return false } - const wasInvalidatedAt = await plugin.providers.kv('tokens-invalidated-at').get(decodedToken.sub) + const wasInvalidatedAt = await getKv('tokens-invalidated-at').get(decodedToken.sub) if (wasInvalidatedAt) { return new Date(wasInvalidatedAt) > new Date() } @@ -126,10 +138,10 @@ const defaultConfig = { refreshTokenExpiryInSeconds: 60 * 60 * 24, // 24 hours checkTokenValidity: checkTokenValidityDefault, invalidateAllTokens: async (sub) => { - await plugin.providers.kv('tokens-invalidated-at').set(sub, new Date().toISOString()) + await getKv('tokens-invalidated-at').set(sub, new Date().toISOString()) }, invalidateToken: async (sub, token) => { - await plugin.providers.kv('invalid-tokens').set(`${sub}:${token}`, true) + await getKv('invalid-tokens').set(`${sub}:${token}`, true) }, reissueBearerToken: (decodedToken) => { if (process.env.NODE_ENV === 'development') { From 7c9b94de88869de3c5a414b69ee1bf1697fca67b Mon Sep 17 00:00:00 2001 From: Ryan Iguchi Date: Mon, 2 Sep 2024 12:14:35 +0200 Subject: [PATCH 2/2] Create three-lamps-wait.md --- .changeset/three-lamps-wait.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/three-lamps-wait.md diff --git a/.changeset/three-lamps-wait.md b/.changeset/three-lamps-wait.md new file mode 100644 index 00000000..33507b70 --- /dev/null +++ b/.changeset/three-lamps-wait.md @@ -0,0 +1,5 @@ +--- +"@zemble/auth": patch +--- + +adding kv map in Auth plugin