refactor(frontend): require refresh/id token in Session, validate at callback boundary

This commit is contained in:
2026-07-05 23:57:19 +02:00
parent 757c74b899
commit dadeac3571
2 changed files with 6 additions and 4 deletions
+2 -3
View File
@@ -12,8 +12,8 @@ export const RETURN_COOKIE = 'mf_oidc_return';
export interface Session extends SessionUser { export interface Session extends SessionUser {
accessToken: string; accessToken: string;
refreshToken?: string; refreshToken: string;
idToken?: string; idToken: string;
expiresAt: number; expiresAt: number;
} }
@@ -89,7 +89,6 @@ export function toSessionUser(claims: Record<string, unknown>, fallback?: Sessio
} }
export async function refreshSession(session: Session): Promise<Session | null> { export async function refreshSession(session: Session): Promise<Session | null> {
if (!session.refreshToken) return null;
try { try {
const config = await getOidcConfig(); const config = await getOidcConfig();
const tokens = await client.refreshTokenGrant(config, session.refreshToken); const tokens = await client.refreshTokenGrant(config, session.refreshToken);
+4 -1
View File
@@ -40,9 +40,12 @@ export const GET: RequestHandler = async ({ url, cookies }) => {
} }
const claims = tokens.claims(); const claims = tokens.claims();
if (!claims) { if (!claims || !tokens.id_token) {
error(401, 'El proveedor no devolvió el token de identidad.'); error(401, 'El proveedor no devolvió el token de identidad.');
} }
if (!tokens.refresh_token) {
error(401, 'El proveedor no devolvió un refresh token; revisa el scope offline_access.');
}
const session: Session = { const session: Session = {
...toSessionUser(claims), ...toSessionUser(claims),