diff --git a/server/routers/badger/verifySession.ts b/server/routers/badger/verifySession.ts index 748164dc8..5d67fd1f1 100644 --- a/server/routers/badger/verifySession.ts +++ b/server/routers/badger/verifySession.ts @@ -720,7 +720,7 @@ export async function verifyResourceSession( ); if (resourceSessionToken) { - const sessionCacheKey = `session:${resourceSessionToken}`; + const sessionCacheKey = `session:${resource.resourceId}:${resourceSessionToken}`; let resourceSession: ResourceSession | null | undefined = localCache.get(sessionCacheKey); @@ -736,6 +736,14 @@ export async function verifyResourceSession( } } + // sessions are scoped to a single resource; never honor one issued for another + if ( + resourceSession && + resourceSession.resourceId !== resource.resourceId + ) { + resourceSession = null; + } + if (resourceSession?.isRequestToken) { logger.debug( "Resource not allowed because session is a temporary request token" @@ -1245,7 +1253,7 @@ async function allowAccessToken( ); if (resourceSessionToken) { - const sessionCacheKey = `session:${resourceSessionToken}`; + const sessionCacheKey = `session:${resource.resourceId}:${resourceSessionToken}`; let resourceSession: ResourceSession | null | undefined = localCache.get(sessionCacheKey); @@ -1262,6 +1270,7 @@ async function allowAccessToken( if ( resourceSession && + resourceSession.resourceId === resource.resourceId && !resourceSession.isRequestToken && resourceSession.accessTokenId === tokenItem.accessTokenId ) {