fix refresh issue
This commit is contained in:
@@ -10,62 +10,16 @@ import UserMetadata from "supertokens-node/recipe/usermetadata";
|
||||
import { getSessionForStart } from "@/lib/supertokens/recipes/start-session";
|
||||
import { Logger } from "@/lib/logger";
|
||||
import z from "zod";
|
||||
import { refreshSession } from "supertokens-node/recipe/session";
|
||||
|
||||
const logger = new Logger("Middleware");
|
||||
|
||||
function createNodeRequest(request: Request) {
|
||||
const cookies = request.headers.get('cookie') || '';
|
||||
|
||||
return {
|
||||
getHeaderValue: (key: string) => {
|
||||
return request.headers.get(key) || undefined;
|
||||
},
|
||||
getCookieValue: (key: string) => {
|
||||
const match = cookies.match(new RegExp(`(^| )${key}=([^;]+)`));
|
||||
return match ? match[2] : undefined;
|
||||
},
|
||||
getMethod: () => request.method,
|
||||
getOriginalURL: () => request.url,
|
||||
};
|
||||
}
|
||||
|
||||
const verifySuperTokensSession = async (
|
||||
request: Request
|
||||
) => {
|
||||
let session = await getSessionForStart(request, { sessionRequired: false });
|
||||
|
||||
if (session?.needsRefresh) {
|
||||
logger.info("Session needs refresh");
|
||||
|
||||
try {
|
||||
|
||||
const nodeRequest = createNodeRequest(request);
|
||||
const nodeResponse = {
|
||||
setHeader: (key: string, value: string) => {
|
||||
setResponseHeader(key, value);
|
||||
},
|
||||
setCookie: (cookie: string) => {
|
||||
setResponseHeader('Set-Cookie', cookie);
|
||||
}
|
||||
};
|
||||
|
||||
const refreshedSession = await refreshSession(nodeRequest, nodeResponse);
|
||||
if (refreshedSession) {
|
||||
session = await getSessionForStart(request, { sessionRequired: false });
|
||||
}
|
||||
if (session?.needsRefresh) {
|
||||
return { context: { session: { tryRefresh: true } } };
|
||||
}
|
||||
} catch (error: any) {
|
||||
logger.error("Session refresh error", error);
|
||||
|
||||
if (error.type === 'UNAUTHORISED' || error.type === 'TOKEN_THEFT_DETECTED') {
|
||||
return { context: { userAuthId: null, roles: [] } };
|
||||
}
|
||||
|
||||
return { context: { session: { tryRefresh: true } } };
|
||||
}
|
||||
logger.info("Session needs refresh - redirecting to client");
|
||||
return { context: { session: { tryRefresh: true } } };
|
||||
}
|
||||
|
||||
const userAuthId = session?.userId;
|
||||
|
||||
Reference in New Issue
Block a user